<?php
if (! defined ( 'PCLZIP_READ_BLOCK_SIZE' )) {
	define ( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
}
if (! defined ( 'PCLZIP_SEPARATOR' )) {
	define ( 'PCLZIP_SEPARATOR', ',' );
}
if (! defined ( 'PCLZIP_ERROR_EXTERNAL' )) {
	define ( 'PCLZIP_ERROR_EXTERNAL', 0 );
}
if (! defined ( 'PCLZIP_TEMPORARY_DIR' )) {
	define ( 'PCLZIP_TEMPORARY_DIR', '' );
}
if (! defined ( 'PCLZIP_TEMPORARY_FILE_RATIO' )) {
	define ( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 );
}
$g_pclzip_version = "2.8.2";
define ( 'PCLZIP_ERR_USER_ABORTED', 2 );
define ( 'PCLZIP_ERR_NO_ERROR', 0 );
define ( 'PCLZIP_ERR_WRITE_OPEN_FAIL', - 1 );
define ( 'PCLZIP_ERR_READ_OPEN_FAIL', - 2 );
define ( 'PCLZIP_ERR_INVALID_PARAMETER', - 3 );
define ( 'PCLZIP_ERR_MISSING_FILE', - 4 );
define ( 'PCLZIP_ERR_FILENAME_TOO_LONG', - 5 );
define ( 'PCLZIP_ERR_INVALID_ZIP', - 6 );
define ( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', - 7 );
define ( 'PCLZIP_ERR_DIR_CREATE_FAIL', - 8 );
define ( 'PCLZIP_ERR_BAD_EXTENSION', - 9 );
define ( 'PCLZIP_ERR_BAD_FORMAT', - 10 );
define ( 'PCLZIP_ERR_DELETE_FILE_FAIL', - 11 );
define ( 'PCLZIP_ERR_RENAME_FILE_FAIL', - 12 );
define ( 'PCLZIP_ERR_BAD_CHECKSUM', - 13 );
define ( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', - 14 );
define ( 'PCLZIP_ERR_MISSING_OPTION_VALUE', - 15 );
define ( 'PCLZIP_ERR_INVALID_OPTION_VALUE', - 16 );
define ( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', - 17 );
define ( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', - 18 );
define ( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', - 19 );
define ( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', - 20 );
define ( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', - 21 );
define ( 'PCLZIP_OPT_PATH', 77001 );
define ( 'PCLZIP_OPT_ADD_PATH', 77002 );
define ( 'PCLZIP_OPT_REMOVE_PATH', 77003 );
define ( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );
define ( 'PCLZIP_OPT_SET_CHMOD', 77005 );
define ( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );
define ( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );
define ( 'PCLZIP_OPT_BY_NAME', 77008 );
define ( 'PCLZIP_OPT_BY_INDEX', 77009 );
define ( 'PCLZIP_OPT_BY_EREG', 77010 );
define ( 'PCLZIP_OPT_BY_PREG', 77011 );
define ( 'PCLZIP_OPT_COMMENT', 77012 );
define ( 'PCLZIP_OPT_ADD_COMMENT', 77013 );
define ( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );
define ( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );
define ( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );
define ( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );
define ( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );
define ( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 );
define ( 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020 );
define ( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 );
define ( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 );
define ( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 );
define ( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 );
define ( 'PCLZIP_ATT_FILE_NAME', 79001 );
define ( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
define ( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );
define ( 'PCLZIP_ATT_FILE_MTIME', 79004 );
define ( 'PCLZIP_ATT_FILE_CONTENT', 79005 );
define ( 'PCLZIP_ATT_FILE_COMMENT', 79006 );
define ( 'PCLZIP_CB_PRE_EXTRACT', 78001 );
define ( 'PCLZIP_CB_POST_EXTRACT', 78002 );
define ( 'PCLZIP_CB_PRE_ADD', 78003 );
define ( 'PCLZIP_CB_POST_ADD', 78004 );
class PclZip {
	var $zipname = '';
	var $zip_fd = 0;
	var $error_code = 1;
	var $error_string = '';
	var $magic_quotes_status;
	function PclZip($p_zipname) {
		if (! function_exists ( 'gzopen' )) {
			die ( 'Abort ' . basename ( __FILE__ ) . ' : Missing zlib extensions' );
		}
		$this->zipname = $p_zipname;
		$this->zip_fd = 0;
		$this->magic_quotes_status = - 1;
		return;
	}
	function create($p_filelist) {
		$v_result = 1;
		$this->privErrorReset ();
		$v_options = array ();
		$v_options [PCLZIP_OPT_NO_COMPRESSION] = FALSE;
		$v_size = func_num_args ();
		if ($v_size > 1) {
			$v_arg_list = func_get_args ();
			array_shift ( $v_arg_list );
			$v_size --;
			if ((is_integer ( $v_arg_list [0] )) && ($v_arg_list [0] > 77000)) {
				$v_result = $this->privParseOptions ( $v_arg_list, $v_size, $v_options, array (
						PCLZIP_OPT_REMOVE_PATH => 'optional',
						PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
						PCLZIP_OPT_ADD_PATH => 'optional',
						PCLZIP_CB_PRE_ADD => 'optional',
						PCLZIP_CB_POST_ADD => 'optional',
						PCLZIP_OPT_NO_COMPRESSION => 'optional',
						PCLZIP_OPT_COMMENT => 'optional',
						PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
						PCLZIP_OPT_TEMP_FILE_ON => 'optional',
						PCLZIP_OPT_TEMP_FILE_OFF => 'optional' 
				) );
				if ($v_result != 1) {
					return 0;
				}
			} else {
				$v_options [PCLZIP_OPT_ADD_PATH] = $v_arg_list [0];
				if ($v_size == 2) {
					$v_options [PCLZIP_OPT_REMOVE_PATH] = $v_arg_list [1];
				} else if ($v_size > 2) {
					PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments" );
					return 0;
				}
			}
		}
		$this->privOptionDefaultThreshold ( $v_options );
		$v_string_list = array ();
		$v_att_list = array ();
		$v_filedescr_list = array ();
		$p_result_list = array ();
		if (is_array ( $p_filelist )) {
			if (isset ( $p_filelist [0] ) && is_array ( $p_filelist [0] )) {
				$v_att_list = $p_filelist;
			} else {
				$v_string_list = $p_filelist;
			}
		} else if (is_string ( $p_filelist )) {
			$v_string_list = explode ( PCLZIP_SEPARATOR, $p_filelist );
		} else {
			PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist" );
			return 0;
		}
		if (sizeof ( $v_string_list ) != 0) {
			foreach ( $v_string_list as $v_string ) {
				if ($v_string != '') {
					$v_att_list [] [PCLZIP_ATT_FILE_NAME] = $v_string;
				} else {
				}
			}
		}
		$v_supported_attributes = array (
				PCLZIP_ATT_FILE_NAME => 'mandatory',
				PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional',
				PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional',
				PCLZIP_ATT_FILE_MTIME => 'optional',
				PCLZIP_ATT_FILE_CONTENT => 'optional',
				PCLZIP_ATT_FILE_COMMENT => 'optional' 
		);
		foreach ( $v_att_list as $v_entry ) {
			$v_result = $this->privFileDescrParseAtt ( $v_entry, $v_filedescr_list [], $v_options, $v_supported_attributes );
			if ($v_result != 1) {
				return 0;
			}
		}
		$v_result = $this->privFileDescrExpand ( $v_filedescr_list, $v_options );
		if ($v_result != 1) {
			return 0;
		}
		$v_result = $this->privCreate ( $v_filedescr_list, $p_result_list, $v_options );
		if ($v_result != 1) {
			return 0;
		}
		return $p_result_list;
	}
	function add($p_filelist) {
		$v_result = 1;
		$this->privErrorReset ();
		$v_options = array ();
		$v_options [PCLZIP_OPT_NO_COMPRESSION] = FALSE;
		$v_size = func_num_args ();
		if ($v_size > 1) {
			$v_arg_list = func_get_args ();
			array_shift ( $v_arg_list );
			$v_size --;
			if ((is_integer ( $v_arg_list [0] )) && ($v_arg_list [0] > 77000)) {
				$v_result = $this->privParseOptions ( $v_arg_list, $v_size, $v_options, array (
						PCLZIP_OPT_REMOVE_PATH => 'optional',
						PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
						PCLZIP_OPT_ADD_PATH => 'optional',
						PCLZIP_CB_PRE_ADD => 'optional',
						PCLZIP_CB_POST_ADD => 'optional',
						PCLZIP_OPT_NO_COMPRESSION => 'optional',
						PCLZIP_OPT_COMMENT => 'optional',
						PCLZIP_OPT_ADD_COMMENT => 'optional',
						PCLZIP_OPT_PREPEND_COMMENT => 'optional',
						PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
						PCLZIP_OPT_TEMP_FILE_ON => 'optional',
						PCLZIP_OPT_TEMP_FILE_OFF => 'optional' 
				) );
				if ($v_result != 1) {
					return 0;
				}
			} else {
				$v_options [PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list [0];
				if ($v_size == 2) {
					$v_options [PCLZIP_OPT_REMOVE_PATH] = $v_arg_list [1];
				} else if ($v_size > 2) {
					PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments" );
					return 0;
				}
			}
		}
		$this->privOptionDefaultThreshold ( $v_options );
		$v_string_list = array ();
		$v_att_list = array ();
		$v_filedescr_list = array ();
		$p_result_list = array ();
		if (is_array ( $p_filelist )) {
			if (isset ( $p_filelist [0] ) && is_array ( $p_filelist [0] )) {
				$v_att_list = $p_filelist;
			} else {
				$v_string_list = $p_filelist;
			}
		} else if (is_string ( $p_filelist )) {
			$v_string_list = explode ( PCLZIP_SEPARATOR, $p_filelist );
		} else {
			PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '" . gettype ( $p_filelist ) . "' for p_filelist" );
			return 0;
		}
		if (sizeof ( $v_string_list ) != 0) {
			foreach ( $v_string_list as $v_string ) {
				$v_att_list [] [PCLZIP_ATT_FILE_NAME] = $v_string;
			}
		}
		$v_supported_attributes = array (
				PCLZIP_ATT_FILE_NAME => 'mandatory',
				PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional',
				PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional',
				PCLZIP_ATT_FILE_MTIME => 'optional',
				PCLZIP_ATT_FILE_CONTENT => 'optional',
				PCLZIP_ATT_FILE_COMMENT => 'optional' 
		);
		foreach ( $v_att_list as $v_entry ) {
			$v_result = $this->privFileDescrParseAtt ( $v_entry, $v_filedescr_list [], $v_options, $v_supported_attributes );
			if ($v_result != 1) {
				return 0;
			}
		}
		$v_result = $this->privFileDescrExpand ( $v_filedescr_list, $v_options );
		if ($v_result != 1) {
			return 0;
		}
		$v_result = $this->privAdd ( $v_filedescr_list, $p_result_list, $v_options );
		if ($v_result != 1) {
			return 0;
		}
		return $p_result_list;
	}
	function listContent() {
		$v_result = 1;
		$this->privErrorReset ();
		if (! $this->privCheckFormat ()) {
			return (0);
		}
		$p_list = array ();
		if (($v_result = $this->privList ( $p_list )) != 1) {
			unset ( $p_list );
			return (0);
		}
		return $p_list;
	}
	function extract() {
		$v_result = 1;
		$this->privErrorReset ();
		if (! $this->privCheckFormat ()) {
			return (0);
		}
		$v_options = array ();
		$v_path = '';
		$v_remove_path = "";
		$v_remove_all_path = false;
		$v_size = func_num_args ();
		$v_options [PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
		if ($v_size > 0) {
			$v_arg_list = func_get_args ();
			if ((is_integer ( $v_arg_list [0] )) && ($v_arg_list [0] > 77000)) {
				$v_result = $this->privParseOptions ( $v_arg_list, $v_size, $v_options, array (
						PCLZIP_OPT_PATH => 'optional',
						PCLZIP_OPT_REMOVE_PATH => 'optional',
						PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
						PCLZIP_OPT_ADD_PATH => 'optional',
						PCLZIP_CB_PRE_EXTRACT => 'optional',
						PCLZIP_CB_POST_EXTRACT => 'optional',
						PCLZIP_OPT_SET_CHMOD => 'optional',
						PCLZIP_OPT_BY_NAME => 'optional',
						PCLZIP_OPT_BY_EREG => 'optional',
						PCLZIP_OPT_BY_PREG => 'optional',
						PCLZIP_OPT_BY_INDEX => 'optional',
						PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
						PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
						PCLZIP_OPT_REPLACE_NEWER => 'optional',
						PCLZIP_OPT_STOP_ON_ERROR => 'optional',
						PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',
						PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
						PCLZIP_OPT_TEMP_FILE_ON => 'optional',
						PCLZIP_OPT_TEMP_FILE_OFF => 'optional' 
				) );
				if ($v_result != 1) {
					return 0;
				}
				if (isset ( $v_options [PCLZIP_OPT_PATH] )) {
					$v_path = $v_options [PCLZIP_OPT_PATH];
				}
				if (isset ( $v_options [PCLZIP_OPT_REMOVE_PATH] )) {
					$v_remove_path = $v_options [PCLZIP_OPT_REMOVE_PATH];
				}
				if (isset ( $v_options [PCLZIP_OPT_REMOVE_ALL_PATH] )) {
					$v_remove_all_path = $v_options [PCLZIP_OPT_REMOVE_ALL_PATH];
				}
				if (isset ( $v_options [PCLZIP_OPT_ADD_PATH] )) {
					if ((strlen ( $v_path ) > 0) && (substr ( $v_path, - 1 ) != '/')) {
						$v_path .= '/';
					}
					$v_path .= $v_options [PCLZIP_OPT_ADD_PATH];
				}
			} else {
				$v_path = $v_arg_list [0];
				if ($v_size == 2) {
					$v_remove_path = $v_arg_list [1];
				} else if ($v_size > 2) {
					PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments" );
					return 0;
				}
			}
		}
		$this->privOptionDefaultThreshold ( $v_options );
		$p_list = array ();
		$v_result = $this->privExtractByRule ( $p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options );
		if ($v_result < 1) {
			unset ( $p_list );
			return (0);
		}
		return $p_list;
	}
	function extractByIndex($p_index) {
		$v_result = 1;
		$this->privErrorReset ();
		if (! $this->privCheckFormat ()) {
			return (0);
		}
		$v_options = array ();
		$v_path = '';
		$v_remove_path = "";
		$v_remove_all_path = false;
		$v_size = func_num_args ();
		$v_options [PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
		if ($v_size > 1) {
			$v_arg_list = func_get_args ();
			array_shift ( $v_arg_list );
			$v_size --;
			if ((is_integer ( $v_arg_list [0] )) && ($v_arg_list [0] > 77000)) {
				$v_result = $this->privParseOptions ( $v_arg_list, $v_size, $v_options, array (
						PCLZIP_OPT_PATH => 'optional',
						PCLZIP_OPT_REMOVE_PATH => 'optional',
						PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
						PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
						PCLZIP_OPT_ADD_PATH => 'optional',
						PCLZIP_CB_PRE_EXTRACT => 'optional',
						PCLZIP_CB_POST_EXTRACT => 'optional',
						PCLZIP_OPT_SET_CHMOD => 'optional',
						PCLZIP_OPT_REPLACE_NEWER => 'optional',
						PCLZIP_OPT_STOP_ON_ERROR => 'optional',
						PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',
						PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
						PCLZIP_OPT_TEMP_FILE_ON => 'optional',
						PCLZIP_OPT_TEMP_FILE_OFF => 'optional' 
				) );
				if ($v_result != 1) {
					return 0;
				}
				if (isset ( $v_options [PCLZIP_OPT_PATH] )) {
					$v_path = $v_options [PCLZIP_OPT_PATH];
				}
				if (isset ( $v_options [PCLZIP_OPT_REMOVE_PATH] )) {
					$v_remove_path = $v_options [PCLZIP_OPT_REMOVE_PATH];
				}
				if (isset ( $v_options [PCLZIP_OPT_REMOVE_ALL_PATH] )) {
					$v_remove_all_path = $v_options [PCLZIP_OPT_REMOVE_ALL_PATH];
				}
				if (isset ( $v_options [PCLZIP_OPT_ADD_PATH] )) {
					if ((strlen ( $v_path ) > 0) && (substr ( $v_path, - 1 ) != '/')) {
						$v_path .= '/';
					}
					$v_path .= $v_options [PCLZIP_OPT_ADD_PATH];
				}
				if (! isset ( $v_options [PCLZIP_OPT_EXTRACT_AS_STRING] )) {
					$v_options [PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
				} else {
				}
			} else {
				$v_path = $v_arg_list [0];
				if ($v_size == 2) {
					$v_remove_path = $v_arg_list [1];
				} else if ($v_size > 2) {
					PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments" );
					return 0;
				}
			}
		}
		$v_arg_trick = array (
				PCLZIP_OPT_BY_INDEX,
				$p_index 
		);
		$v_options_trick = array ();
		$v_result = $this->privParseOptions ( $v_arg_trick, sizeof ( $v_arg_trick ), $v_options_trick, array (
				PCLZIP_OPT_BY_INDEX => 'optional' 
		) );
		if ($v_result != 1) {
			return 0;
		}
		$v_options [PCLZIP_OPT_BY_INDEX] = $v_options_trick [PCLZIP_OPT_BY_INDEX];
		$this->privOptionDefaultThreshold ( $v_options );
		if (($v_result = $this->privExtractByRule ( $p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options )) < 1) {
			return (0);
		}
		return $p_list;
	}
	function delete() {
		$v_result = 1;
		$this->privErrorReset ();
		if (! $this->privCheckFormat ()) {
			return (0);
		}
		$v_options = array ();
		$v_size = func_num_args ();
		if ($v_size > 0) {
			$v_arg_list = func_get_args ();
			$v_result = $this->privParseOptions ( $v_arg_list, $v_size, $v_options, array (
					PCLZIP_OPT_BY_NAME => 'optional',
					PCLZIP_OPT_BY_EREG => 'optional',
					PCLZIP_OPT_BY_PREG => 'optional',
					PCLZIP_OPT_BY_INDEX => 'optional' 
			) );
			if ($v_result != 1) {
				return 0;
			}
		}
		$this->privDisableMagicQuotes ();
		$v_list = array ();
		if (($v_result = $this->privDeleteByRule ( $v_list, $v_options )) != 1) {
			$this->privSwapBackMagicQuotes ();
			unset ( $v_list );
			return (0);
		}
		$this->privSwapBackMagicQuotes ();
		return $v_list;
	}
	function deleteByIndex($p_index) {
		$p_list = $this->delete ( PCLZIP_OPT_BY_INDEX, $p_index );
		return $p_list;
	}
	function properties() {
		$this->privErrorReset ();
		$this->privDisableMagicQuotes ();
		if (! $this->privCheckFormat ()) {
			$this->privSwapBackMagicQuotes ();
			return (0);
		}
		$v_prop = array ();
		$v_prop ['comment'] = '';
		$v_prop ['nb'] = 0;
		$v_prop ['status'] = 'not_exist';
		if (@is_file ( $this->zipname )) {
			if (($this->zip_fd = @fopen ( $this->zipname, 'rb' )) == 0) {
				$this->privSwapBackMagicQuotes ();
				PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \'' . $this->zipname . '\' in binary read mode' );
				return 0;
			}
			$v_central_dir = array ();
			if (($v_result = $this->privReadEndCentralDir ( $v_central_dir )) != 1) {
				$this->privSwapBackMagicQuotes ();
				return 0;
			}
			$this->privCloseFd ();
			$v_prop ['comment'] = $v_central_dir ['comment'];
			$v_prop ['nb'] = $v_central_dir ['entries'];
			$v_prop ['status'] = 'ok';
		}
		$this->privSwapBackMagicQuotes ();
		return $v_prop;
	}
	function duplicate($p_archive) {
		$v_result = 1;
		$this->privErrorReset ();
		if ((is_object ( $p_archive )) && (get_class ( $p_archive ) == 'pclzip')) {
			$v_result = $this->privDuplicate ( $p_archive->zipname );
		} else if (is_string ( $p_archive )) {
			if (! is_file ( $p_archive )) {
				PclZip::privErrorLog ( PCLZIP_ERR_MISSING_FILE, "No file with filename '" . $p_archive . "'" );
				$v_result = PCLZIP_ERR_MISSING_FILE;
			} else {
				$v_result = $this->privDuplicate ( $p_archive );
			}
		} else {
			PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add" );
			$v_result = PCLZIP_ERR_INVALID_PARAMETER;
		}
		return $v_result;
	}
	function merge($p_archive_to_add) {
		$v_result = 1;
		$this->privErrorReset ();
		if (! $this->privCheckFormat ()) {
			return (0);
		}
		if ((is_object ( $p_archive_to_add )) && (get_class ( $p_archive_to_add ) == 'pclzip')) {
			$v_result = $this->privMerge ( $p_archive_to_add );
		} else if (is_string ( $p_archive_to_add )) {
			$v_object_archive = new PclZip ( $p_archive_to_add );
			$v_result = $this->privMerge ( $v_object_archive );
		} else {
			PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add" );
			$v_result = PCLZIP_ERR_INVALID_PARAMETER;
		}
		return $v_result;
	}
	function errorCode() {
		if (PCLZIP_ERROR_EXTERNAL == 1) {
			return (PclErrorCode ());
		} else {
			return ($this->error_code);
		}
	}
	function errorName($p_with_code = false) {
		$v_name = array (
				PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
				PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
				PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
				PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
				PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
				PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
				PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
				PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
				PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
				PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
				PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
				PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
				PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
				PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
				PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
				PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
				PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
				PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
				PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION',
				PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE',
				PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' 
		);
		if (isset ( $v_name [$this->error_code] )) {
			$v_value = $v_name [$this->error_code];
		} else {
			$v_value = 'NoName';
		}
		if ($p_with_code) {
			return ($v_value . ' (' . $this->error_code . ')');
		} else {
			return ($v_value);
		}
	}
	function errorInfo($p_full = false) {
		if (PCLZIP_ERROR_EXTERNAL == 1) {
			return (PclErrorString ());
		} else {
			if ($p_full) {
				return ($this->errorName ( true ) . " : " . $this->error_string);
			} else {
				return ($this->error_string . " [code " . $this->error_code . "]");
			}
		}
	}
	function privCheckFormat($p_level = 0) {
		$v_result = true;
		clearstatcache ();
		$this->privErrorReset ();
		if (! is_file ( $this->zipname )) {
			PclZip::privErrorLog ( PCLZIP_ERR_MISSING_FILE, "Missing archive file '" . $this->zipname . "'" );
			return (false);
		}
		if (! is_readable ( $this->zipname )) {
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '" . $this->zipname . "'" );
			return (false);
		}
		return $v_result;
	}
	function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options = false) {
		$v_result = 1;
		$i = 0;
		while ( $i < $p_size ) {
			if (! isset ( $v_requested_options [$p_options_list [$i]] )) {
				PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '" . $p_options_list [$i] . "' for this method" );
				return PclZip::errorCode ();
			}
			switch ($p_options_list [$i]) {
				case PCLZIP_OPT_PATH :
				case PCLZIP_OPT_REMOVE_PATH :
				case PCLZIP_OPT_ADD_PATH :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$v_result_list [$p_options_list [$i]] = PclZipUtilTranslateWinPath ( $p_options_list [$i + 1], FALSE );
					$i ++;
					break;
				case PCLZIP_OPT_TEMP_FILE_THRESHOLD :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					if (isset ( $v_result_list [PCLZIP_OPT_TEMP_FILE_OFF] )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'" );
						return PclZip::errorCode ();
					}
					$v_value = $p_options_list [$i + 1];
					if ((! is_integer ( $v_value )) || ($v_value < 0)) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$v_result_list [$p_options_list [$i]] = $v_value * 1048576;
					$i ++;
					break;
				case PCLZIP_OPT_TEMP_FILE_ON :
					if (isset ( $v_result_list [PCLZIP_OPT_TEMP_FILE_OFF] )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'" );
						return PclZip::errorCode ();
					}
					$v_result_list [$p_options_list [$i]] = true;
					break;
				case PCLZIP_OPT_TEMP_FILE_OFF :
					if (isset ( $v_result_list [PCLZIP_OPT_TEMP_FILE_ON] )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'" );
						return PclZip::errorCode ();
					}
					if (isset ( $v_result_list [PCLZIP_OPT_TEMP_FILE_THRESHOLD] )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'" );
						return PclZip::errorCode ();
					}
					$v_result_list [$p_options_list [$i]] = true;
					break;
				case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					if (is_string ( $p_options_list [$i + 1] ) && ($p_options_list [$i + 1] != '')) {
						$v_result_list [$p_options_list [$i]] = PclZipUtilTranslateWinPath ( $p_options_list [$i + 1], FALSE );
						$i ++;
					} else {
					}
					break;
				case PCLZIP_OPT_BY_NAME :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					if (is_string ( $p_options_list [$i + 1] )) {
						$v_result_list [$p_options_list [$i]] [0] = $p_options_list [$i + 1];
					} else if (is_array ( $p_options_list [$i + 1] )) {
						$v_result_list [$p_options_list [$i]] = $p_options_list [$i + 1];
					} else {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$i ++;
					break;
				case PCLZIP_OPT_BY_EREG :
					$p_options_list [$i] = PCLZIP_OPT_BY_PREG;
				case PCLZIP_OPT_BY_PREG :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					if (is_string ( $p_options_list [$i + 1] )) {
						$v_result_list [$p_options_list [$i]] = $p_options_list [$i + 1];
					} else {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$i ++;
					break;
				case PCLZIP_OPT_COMMENT :
				case PCLZIP_OPT_ADD_COMMENT :
				case PCLZIP_OPT_PREPEND_COMMENT :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					if (is_string ( $p_options_list [$i + 1] )) {
						$v_result_list [$p_options_list [$i]] = $p_options_list [$i + 1];
					} else {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$i ++;
					break;
				case PCLZIP_OPT_BY_INDEX :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$v_work_list = array ();
					if (is_string ( $p_options_list [$i + 1] )) {
						$p_options_list [$i + 1] = strtr ( $p_options_list [$i + 1], ' ', '' );
						$v_work_list = explode ( ",", $p_options_list [$i + 1] );
					} else if (is_integer ( $p_options_list [$i + 1] )) {
						$v_work_list [0] = $p_options_list [$i + 1] . '-' . $p_options_list [$i + 1];
					} else if (is_array ( $p_options_list [$i + 1] )) {
						$v_work_list = $p_options_list [$i + 1];
					} else {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$v_sort_flag = false;
					$v_sort_value = 0;
					for($j = 0; $j < sizeof ( $v_work_list ); $j ++) {
						$v_item_list = explode ( "-", $v_work_list [$j] );
						$v_size_item_list = sizeof ( $v_item_list );
						if ($v_size_item_list == 1) {
							$v_result_list [$p_options_list [$i]] [$j] ['start'] = $v_item_list [0];
							$v_result_list [$p_options_list [$i]] [$j] ['end'] = $v_item_list [0];
						} elseif ($v_size_item_list == 2) {
							$v_result_list [$p_options_list [$i]] [$j] ['start'] = $v_item_list [0];
							$v_result_list [$p_options_list [$i]] [$j] ['end'] = $v_item_list [1];
						} else {
							PclZip::privErrorLog ( PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
							return PclZip::errorCode ();
						}
						if ($v_result_list [$p_options_list [$i]] [$j] ['start'] < $v_sort_value) {
							$v_sort_flag = true;
							PclZip::privErrorLog ( PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
							return PclZip::errorCode ();
						}
						$v_sort_value = $v_result_list [$p_options_list [$i]] [$j] ['start'];
					}
					if ($v_sort_flag) {
					}
					$i ++;
					break;
				case PCLZIP_OPT_REMOVE_ALL_PATH :
				case PCLZIP_OPT_EXTRACT_AS_STRING :
				case PCLZIP_OPT_NO_COMPRESSION :
				case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
				case PCLZIP_OPT_REPLACE_NEWER :
				case PCLZIP_OPT_STOP_ON_ERROR :
					$v_result_list [$p_options_list [$i]] = true;
					break;
				case PCLZIP_OPT_SET_CHMOD :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$v_result_list [$p_options_list [$i]] = $p_options_list [$i + 1];
					$i ++;
					break;
				case PCLZIP_CB_PRE_EXTRACT :
				case PCLZIP_CB_POST_EXTRACT :
				case PCLZIP_CB_PRE_ADD :
				case PCLZIP_CB_POST_ADD :
					if (($i + 1) >= $p_size) {
						PclZip::privErrorLog ( PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$v_function_name = $p_options_list [$i + 1];
					if (! function_exists ( $v_function_name )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '" . $v_function_name . "()' is not an existing function for option '" . PclZipUtilOptionText ( $p_options_list [$i] ) . "'" );
						return PclZip::errorCode ();
					}
					$v_result_list [$p_options_list [$i]] = $v_function_name;
					$i ++;
					break;
				default :
					PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" . $p_options_list [$i] . "'" );
					return PclZip::errorCode ();
			}
			$i ++;
		}
		if ($v_requested_options !== false) {
			for($key = reset ( $v_requested_options ); $key = key ( $v_requested_options ); $key = next ( $v_requested_options )) {
				if ($v_requested_options [$key] == 'mandatory') {
					if (! isset ( $v_result_list [$key] )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter " . PclZipUtilOptionText ( $key ) . "(" . $key . ")" );
						return PclZip::errorCode ();
					}
				}
			}
		}
		if (! isset ( $v_result_list [PCLZIP_OPT_TEMP_FILE_THRESHOLD] )) {
		}
		return $v_result;
	}
	function privOptionDefaultThreshold(&$p_options) {
		$v_result = 1;
		if (isset ( $p_options [PCLZIP_OPT_TEMP_FILE_THRESHOLD] ) || isset ( $p_options [PCLZIP_OPT_TEMP_FILE_OFF] )) {
			return $v_result;
		}
		$v_memory_limit = ini_get ( 'memory_limit' );
		$v_memory_limit = trim ( $v_memory_limit );
		$last = strtolower ( substr ( $v_memory_limit, - 1 ) );
		if ($last == 'g')
			$v_memory_limit = $v_memory_limit * 1073741824;
		if ($last == 'm')
			$v_memory_limit = $v_memory_limit * 1048576;
		if ($last == 'k')
			$v_memory_limit = $v_memory_limit * 1024;
		$p_options [PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor ( $v_memory_limit * PCLZIP_TEMPORARY_FILE_RATIO );
		if ($p_options [PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {
			unset ( $p_options [PCLZIP_OPT_TEMP_FILE_THRESHOLD] );
		}
		return $v_result;
	}
	function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options = false) {
		$v_result = 1;
		foreach ( $p_file_list as $v_key => $v_value ) {
			if (! isset ( $v_requested_options [$v_key] )) {
				PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '" . $v_key . "' for this file" );
				return PclZip::errorCode ();
			}
			switch ($v_key) {
				case PCLZIP_ATT_FILE_NAME :
					if (! is_string ( $v_value )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype ( $v_value ) . ". String expected for attribute '" . PclZipUtilOptionText ( $v_key ) . "'" );
						return PclZip::errorCode ();
					}
					$p_filedescr ['filename'] = PclZipUtilPathReduction ( $v_value );
					if ($p_filedescr ['filename'] == '') {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '" . PclZipUtilOptionText ( $v_key ) . "'" );
						return PclZip::errorCode ();
					}
					break;
				case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
					if (! is_string ( $v_value )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype ( $v_value ) . ". String expected for attribute '" . PclZipUtilOptionText ( $v_key ) . "'" );
						return PclZip::errorCode ();
					}
					$p_filedescr ['new_short_name'] = PclZipUtilPathReduction ( $v_value );
					if ($p_filedescr ['new_short_name'] == '') {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '" . PclZipUtilOptionText ( $v_key ) . "'" );
						return PclZip::errorCode ();
					}
					break;
				case PCLZIP_ATT_FILE_NEW_FULL_NAME :
					if (! is_string ( $v_value )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype ( $v_value ) . ". String expected for attribute '" . PclZipUtilOptionText ( $v_key ) . "'" );
						return PclZip::errorCode ();
					}
					$p_filedescr ['new_full_name'] = PclZipUtilPathReduction ( $v_value );
					if ($p_filedescr ['new_full_name'] == '') {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '" . PclZipUtilOptionText ( $v_key ) . "'" );
						return PclZip::errorCode ();
					}
					break;
				case PCLZIP_ATT_FILE_COMMENT :
					if (! is_string ( $v_value )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype ( $v_value ) . ". String expected for attribute '" . PclZipUtilOptionText ( $v_key ) . "'" );
						return PclZip::errorCode ();
					}
					$p_filedescr ['comment'] = $v_value;
					break;
				case PCLZIP_ATT_FILE_MTIME :
					if (! is_integer ( $v_value )) {
						PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype ( $v_value ) . ". Integer expected for attribute '" . PclZipUtilOptionText ( $v_key ) . "'" );
						return PclZip::errorCode ();
					}
					$p_filedescr ['mtime'] = $v_value;
					break;
				case PCLZIP_ATT_FILE_CONTENT :
					$p_filedescr ['content'] = $v_value;
					break;
				default :
					PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" . $v_key . "'" );
					return PclZip::errorCode ();
			}
			if ($v_requested_options !== false) {
				for($key = reset ( $v_requested_options ); $key = key ( $v_requested_options ); $key = next ( $v_requested_options )) {
					if ($v_requested_options [$key] == 'mandatory') {
						if (! isset ( $p_file_list [$key] )) {
							PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter " . PclZipUtilOptionText ( $key ) . "(" . $key . ")" );
							return PclZip::errorCode ();
						}
					}
				}
			}
		}
		return $v_result;
	}
	function privFileDescrExpand(&$p_filedescr_list, &$p_options) {
		$v_result = 1;
		$v_result_list = array ();
		for($i = 0; $i < sizeof ( $p_filedescr_list ); $i ++) {
			$v_descr = $p_filedescr_list [$i];
			$v_descr ['filename'] = PclZipUtilTranslateWinPath ( $v_descr ['filename'], false );
			$v_descr ['filename'] = PclZipUtilPathReduction ( $v_descr ['filename'] );
			if (file_exists ( $v_descr ['filename'] )) {
				if (@is_file ( $v_descr ['filename'] )) {
					$v_descr ['type'] = 'file';
				} else if (@is_dir ( $v_descr ['filename'] )) {
					$v_descr ['type'] = 'folder';
				} else if (@is_link ( $v_descr ['filename'] )) {
					continue;
				} else {
					continue;
				}
			} else if (isset ( $v_descr ['content'] )) {
				$v_descr ['type'] = 'virtual_file';
			} else {
				PclZip::privErrorLog ( PCLZIP_ERR_MISSING_FILE, "File '" . $v_descr ['filename'] . "' does not exist" );
				return PclZip::errorCode ();
			}
			$this->privCalculateStoredFilename ( $v_descr, $p_options );
			$v_result_list [sizeof ( $v_result_list )] = $v_descr;
			if ($v_descr ['type'] == 'folder') {
				$v_dirlist_descr = array ();
				$v_dirlist_nb = 0;
				if ($v_folder_handler = @opendir ( $v_descr ['filename'] )) {
					while ( ($v_item_handler = @readdir ( $v_folder_handler )) !== false ) {
						if (($v_item_handler == '.') || ($v_item_handler == '..')) {
							continue;
						}
						$v_dirlist_descr [$v_dirlist_nb] ['filename'] = $v_descr ['filename'] . '/' . $v_item_handler;
						if (($v_descr ['stored_filename'] != $v_descr ['filename']) && (! isset ( $p_options [PCLZIP_OPT_REMOVE_ALL_PATH] ))) {
							if ($v_descr ['stored_filename'] != '') {
								$v_dirlist_descr [$v_dirlist_nb] ['new_full_name'] = $v_descr ['stored_filename'] . '/' . $v_item_handler;
							} else {
								$v_dirlist_descr [$v_dirlist_nb] ['new_full_name'] = $v_item_handler;
							}
						}
						$v_dirlist_nb ++;
					}
					@closedir ( $v_folder_handler );
				} else {
				}
				if ($v_dirlist_nb != 0) {
					if (($v_result = $this->privFileDescrExpand ( $v_dirlist_descr, $p_options )) != 1) {
						return $v_result;
					}
					$v_result_list = array_merge ( $v_result_list, $v_dirlist_descr );
				} else {
				}
				unset ( $v_dirlist_descr );
			}
		}
		$p_filedescr_list = $v_result_list;
		return $v_result;
	}
	function privCreate($p_filedescr_list, &$p_result_list, &$p_options) {
		$v_result = 1;
		$v_list_detail = array ();
		$this->privDisableMagicQuotes ();
		if (($v_result = $this->privOpenFd ( 'wb' )) != 1) {
			return $v_result;
		}
		$v_result = $this->privAddList ( $p_filedescr_list, $p_result_list, $p_options );
		$this->privCloseFd ();
		$this->privSwapBackMagicQuotes ();
		return $v_result;
	}
	function privAdd($p_filedescr_list, &$p_result_list, &$p_options) {
		$v_result = 1;
		$v_list_detail = array ();
		if ((! is_file ( $this->zipname )) || (filesize ( $this->zipname ) == 0)) {
			$v_result = $this->privCreate ( $p_filedescr_list, $p_result_list, $p_options );
			return $v_result;
		}
		$this->privDisableMagicQuotes ();
		if (($v_result = $this->privOpenFd ( 'rb' )) != 1) {
			$this->privSwapBackMagicQuotes ();
			return $v_result;
		}
		$v_central_dir = array ();
		if (($v_result = $this->privReadEndCentralDir ( $v_central_dir )) != 1) {
			$this->privCloseFd ();
			$this->privSwapBackMagicQuotes ();
			return $v_result;
		}
		@rewind ( $this->zip_fd );
		$v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid ( 'pclzip-' ) . '.tmp';
		if (($v_zip_temp_fd = @fopen ( $v_zip_temp_name, 'wb' )) == 0) {
			$this->privCloseFd ();
			$this->privSwapBackMagicQuotes ();
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_zip_temp_name . '\' in binary write mode' );
			return PclZip::errorCode ();
		}
		$v_size = $v_central_dir ['offset'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = fread ( $this->zip_fd, $v_read_size );
			@fwrite ( $v_zip_temp_fd, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		$v_swap = $this->zip_fd;
		$this->zip_fd = $v_zip_temp_fd;
		$v_zip_temp_fd = $v_swap;
		$v_header_list = array ();
		if (($v_result = $this->privAddFileList ( $p_filedescr_list, $v_header_list, $p_options )) != 1) {
			fclose ( $v_zip_temp_fd );
			$this->privCloseFd ();
			@unlink ( $v_zip_temp_name );
			$this->privSwapBackMagicQuotes ();
			return $v_result;
		}
		$v_offset = @ftell ( $this->zip_fd );
		$v_size = $v_central_dir ['size'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @fread ( $v_zip_temp_fd, $v_read_size );
			@fwrite ( $this->zip_fd, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		for($i = 0, $v_count = 0; $i < sizeof ( $v_header_list ); $i ++) {
			if ($v_header_list [$i] ['status'] == 'ok') {
				if (($v_result = $this->privWriteCentralFileHeader ( $v_header_list [$i] )) != 1) {
					fclose ( $v_zip_temp_fd );
					$this->privCloseFd ();
					@unlink ( $v_zip_temp_name );
					$this->privSwapBackMagicQuotes ();
					return $v_result;
				}
				$v_count ++;
			}
			$this->privConvertHeader2FileInfo ( $v_header_list [$i], $p_result_list [$i] );
		}
		$v_comment = $v_central_dir ['comment'];
		if (isset ( $p_options [PCLZIP_OPT_COMMENT] )) {
			$v_comment = $p_options [PCLZIP_OPT_COMMENT];
		}
		if (isset ( $p_options [PCLZIP_OPT_ADD_COMMENT] )) {
			$v_comment = $v_comment . $p_options [PCLZIP_OPT_ADD_COMMENT];
		}
		if (isset ( $p_options [PCLZIP_OPT_PREPEND_COMMENT] )) {
			$v_comment = $p_options [PCLZIP_OPT_PREPEND_COMMENT] . $v_comment;
		}
		$v_size = @ftell ( $this->zip_fd ) - $v_offset;
		if (($v_result = $this->privWriteCentralHeader ( $v_count + $v_central_dir ['entries'], $v_size, $v_offset, $v_comment )) != 1) {
			unset ( $v_header_list );
			$this->privSwapBackMagicQuotes ();
			return $v_result;
		}
		$v_swap = $this->zip_fd;
		$this->zip_fd = $v_zip_temp_fd;
		$v_zip_temp_fd = $v_swap;
		$this->privCloseFd ();
		@fclose ( $v_zip_temp_fd );
		$this->privSwapBackMagicQuotes ();
		@unlink ( $this->zipname );
		PclZipUtilRename ( $v_zip_temp_name, $this->zipname );
		return $v_result;
	}
	function privOpenFd($p_mode) {
		$v_result = 1;
		if ($this->zip_fd != 0) {
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \'' . $this->zipname . '\' already open' );
			return PclZip::errorCode ();
		}
		if (($this->zip_fd = @fopen ( $this->zipname, $p_mode )) == 0) {
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \'' . $this->zipname . '\' in ' . $p_mode . ' mode' );
			return PclZip::errorCode ();
		}
		return $v_result;
	}
	function privCloseFd() {
		$v_result = 1;
		if ($this->zip_fd != 0)
			@fclose ( $this->zip_fd );
		$this->zip_fd = 0;
		return $v_result;
	}
	function privAddList($p_filedescr_list, &$p_result_list, &$p_options) {
		$v_result = 1;
		$v_header_list = array ();
		if (($v_result = $this->privAddFileList ( $p_filedescr_list, $v_header_list, $p_options )) != 1) {
			return $v_result;
		}
		$v_offset = @ftell ( $this->zip_fd );
		for($i = 0, $v_count = 0; $i < sizeof ( $v_header_list ); $i ++) {
			if ($v_header_list [$i] ['status'] == 'ok') {
				if (($v_result = $this->privWriteCentralFileHeader ( $v_header_list [$i] )) != 1) {
					return $v_result;
				}
				$v_count ++;
			}
			$this->privConvertHeader2FileInfo ( $v_header_list [$i], $p_result_list [$i] );
		}
		$v_comment = '';
		if (isset ( $p_options [PCLZIP_OPT_COMMENT] )) {
			$v_comment = $p_options [PCLZIP_OPT_COMMENT];
		}
		$v_size = @ftell ( $this->zip_fd ) - $v_offset;
		if (($v_result = $this->privWriteCentralHeader ( $v_count, $v_size, $v_offset, $v_comment )) != 1) {
			unset ( $v_header_list );
			return $v_result;
		}
		return $v_result;
	}
	function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) {
		$v_result = 1;
		$v_header = array ();
		$v_nb = sizeof ( $p_result_list );
		for($j = 0; ($j < sizeof ( $p_filedescr_list )) && ($v_result == 1); $j ++) {
			$p_filedescr_list [$j] ['filename'] = PclZipUtilTranslateWinPath ( $p_filedescr_list [$j] ['filename'], false );
			if ($p_filedescr_list [$j] ['filename'] == "") {
				continue;
			}
			if (($p_filedescr_list [$j] ['type'] != 'virtual_file') && (! file_exists ( $p_filedescr_list [$j] ['filename'] ))) {
				PclZip::privErrorLog ( PCLZIP_ERR_MISSING_FILE, "File '" . $p_filedescr_list [$j] ['filename'] . "' does not exist" );
				return PclZip::errorCode ();
			}
			if (($p_filedescr_list [$j] ['type'] == 'file') || ($p_filedescr_list [$j] ['type'] == 'virtual_file') || (($p_filedescr_list [$j] ['type'] == 'folder') && (! isset ( $p_options [PCLZIP_OPT_REMOVE_ALL_PATH] ) || ! $p_options [PCLZIP_OPT_REMOVE_ALL_PATH]))) {
				$v_result = $this->privAddFile ( $p_filedescr_list [$j], $v_header, $p_options );
				if ($v_result != 1) {
					return $v_result;
				}
				$p_result_list [$v_nb ++] = $v_header;
			}
		}
		return $v_result;
	}
	function privAddFile($p_filedescr, &$p_header, &$p_options) {
		$v_result = 1;
		$p_filename = $p_filedescr ['filename'];
		if ($p_filename == "") {
			PclZip::privErrorLog ( PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)" );
			return PclZip::errorCode ();
		}
		clearstatcache ();
		$p_header ['version'] = 20;
		$p_header ['version_extracted'] = 10;
		$p_header ['flag'] = 0;
		$p_header ['compression'] = 0;
		$p_header ['crc'] = 0;
		$p_header ['compressed_size'] = 0;
		$p_header ['filename_len'] = strlen ( $p_filename );
		$p_header ['extra_len'] = 0;
		$p_header ['disk'] = 0;
		$p_header ['internal'] = 0;
		$p_header ['offset'] = 0;
		$p_header ['filename'] = $p_filename;
		$p_header ['stored_filename'] = $p_filedescr ['stored_filename'];
		$p_header ['extra'] = '';
		$p_header ['status'] = 'ok';
		$p_header ['index'] = - 1;
		if ($p_filedescr ['type'] == 'file') {
			$p_header ['external'] = 0x00000000;
			$p_header ['size'] = filesize ( $p_filename );
		} else if ($p_filedescr ['type'] == 'folder') {
			$p_header ['external'] = 0x00000010;
			$p_header ['mtime'] = filemtime ( $p_filename );
			$p_header ['size'] = filesize ( $p_filename );
		} else if ($p_filedescr ['type'] == 'virtual_file') {
			$p_header ['external'] = 0x00000000;
			$p_header ['size'] = strlen ( $p_filedescr ['content'] );
		}
		if (isset ( $p_filedescr ['mtime'] )) {
			$p_header ['mtime'] = $p_filedescr ['mtime'];
		} else if ($p_filedescr ['type'] == 'virtual_file') {
			$p_header ['mtime'] = time ();
		} else {
			$p_header ['mtime'] = filemtime ( $p_filename );
		}
		if (isset ( $p_filedescr ['comment'] )) {
			$p_header ['comment_len'] = strlen ( $p_filedescr ['comment'] );
			$p_header ['comment'] = $p_filedescr ['comment'];
		} else {
			$p_header ['comment_len'] = 0;
			$p_header ['comment'] = '';
		}
		if (isset ( $p_options [PCLZIP_CB_PRE_ADD] )) {
			$v_local_header = array ();
			$this->privConvertHeader2FileInfo ( $p_header, $v_local_header );
			$v_result = $p_options [PCLZIP_CB_PRE_ADD] ( PCLZIP_CB_PRE_ADD, $v_local_header );
			if ($v_result == 0) {
				$p_header ['status'] = "skipped";
				$v_result = 1;
			}
			if ($p_header ['stored_filename'] != $v_local_header ['stored_filename']) {
				$p_header ['stored_filename'] = PclZipUtilPathReduction ( $v_local_header ['stored_filename'] );
			}
		}
		if ($p_header ['stored_filename'] == "") {
			$p_header ['status'] = "filtered";
		}
		if (strlen ( $p_header ['stored_filename'] ) > 0xFF) {
			$p_header ['status'] = 'filename_too_long';
		}
		if ($p_header ['status'] == 'ok') {
			if ($p_filedescr ['type'] == 'file') {
				if ((! isset ( $p_options [PCLZIP_OPT_TEMP_FILE_OFF] )) && (isset ( $p_options [PCLZIP_OPT_TEMP_FILE_ON] ) || (isset ( $p_options [PCLZIP_OPT_TEMP_FILE_THRESHOLD] ) && ($p_options [PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header ['size'])))) {
					$v_result = $this->privAddFileUsingTempFile ( $p_filedescr, $p_header, $p_options );
					if ($v_result < PCLZIP_ERR_NO_ERROR) {
						return $v_result;
					}
				} else {
					if (($v_file = @fopen ( $p_filename, "rb" )) == 0) {
						PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode" );
						return PclZip::errorCode ();
					}
					$v_content = @fread ( $v_file, $p_header ['size'] );
					@fclose ( $v_file );
					$p_header ['crc'] = @crc32 ( $v_content );
					if ($p_options [PCLZIP_OPT_NO_COMPRESSION]) {
						$p_header ['compressed_size'] = $p_header ['size'];
						$p_header ['compression'] = 0;
					} else {
						$v_content = @gzdeflate ( $v_content );
						$p_header ['compressed_size'] = strlen ( $v_content );
						$p_header ['compression'] = 8;
					}
					if (($v_result = $this->privWriteFileHeader ( $p_header )) != 1) {
						@fclose ( $v_file );
						return $v_result;
					}
					@fwrite ( $this->zip_fd, $v_content, $p_header ['compressed_size'] );
				}
			} else if ($p_filedescr ['type'] == 'virtual_file') {
				$v_content = $p_filedescr ['content'];
				$p_header ['crc'] = @crc32 ( $v_content );
				if ($p_options [PCLZIP_OPT_NO_COMPRESSION]) {
					$p_header ['compressed_size'] = $p_header ['size'];
					$p_header ['compression'] = 0;
				} else {
					$v_content = @gzdeflate ( $v_content );
					$p_header ['compressed_size'] = strlen ( $v_content );
					$p_header ['compression'] = 8;
				}
				if (($v_result = $this->privWriteFileHeader ( $p_header )) != 1) {
					@fclose ( $v_file );
					return $v_result;
				}
				@fwrite ( $this->zip_fd, $v_content, $p_header ['compressed_size'] );
			} else if ($p_filedescr ['type'] == 'folder') {
				if (@substr ( $p_header ['stored_filename'], - 1 ) != '/') {
					$p_header ['stored_filename'] .= '/';
				}
				$p_header ['size'] = 0;
				$p_header ['external'] = 0x00000010;
				if (($v_result = $this->privWriteFileHeader ( $p_header )) != 1) {
					return $v_result;
				}
			}
		}
		if (isset ( $p_options [PCLZIP_CB_POST_ADD] )) {
			$v_local_header = array ();
			$this->privConvertHeader2FileInfo ( $p_header, $v_local_header );
			$v_result = $p_options [PCLZIP_CB_POST_ADD] ( PCLZIP_CB_POST_ADD, $v_local_header );
			if ($v_result == 0) {
				$v_result = 1;
			}
		}
		return $v_result;
	}
	function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) {
		$v_result = PCLZIP_ERR_NO_ERROR;
		$p_filename = $p_filedescr ['filename'];
		if (($v_file = @fopen ( $p_filename, "rb" )) == 0) {
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode" );
			return PclZip::errorCode ();
		}
		$v_gzip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid ( 'pclzip-' ) . '.gz';
		if (($v_file_compressed = @gzopen ( $v_gzip_temp_name, "wb" )) == 0) {
			fclose ( $v_file );
			PclZip::privErrorLog ( PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary write mode' );
			return PclZip::errorCode ();
		}
		$v_size = filesize ( $p_filename );
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @fread ( $v_file, $v_read_size );
			@gzputs ( $v_file_compressed, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		@fclose ( $v_file );
		@gzclose ( $v_file_compressed );
		if (filesize ( $v_gzip_temp_name ) < 18) {
			PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \'' . $v_gzip_temp_name . '\' has invalid filesize - should be minimum 18 bytes' );
			return PclZip::errorCode ();
		}
		if (($v_file_compressed = @fopen ( $v_gzip_temp_name, "rb" )) == 0) {
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode' );
			return PclZip::errorCode ();
		}
		$v_binary_data = @fread ( $v_file_compressed, 10 );
		$v_data_header = unpack ( 'a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data );
		$v_data_header ['os'] = bin2hex ( $v_data_header ['os'] );
		@fseek ( $v_file_compressed, filesize ( $v_gzip_temp_name ) - 8 );
		$v_binary_data = @fread ( $v_file_compressed, 8 );
		$v_data_footer = unpack ( 'Vcrc/Vcompressed_size', $v_binary_data );
		$p_header ['compression'] = ord ( $v_data_header ['cm'] );
		$p_header ['crc'] = $v_data_footer ['crc'];
		$p_header ['compressed_size'] = filesize ( $v_gzip_temp_name ) - 18;
		@fclose ( $v_file_compressed );
		if (($v_result = $this->privWriteFileHeader ( $p_header )) != 1) {
			return $v_result;
		}
		if (($v_file_compressed = @fopen ( $v_gzip_temp_name, "rb" )) == 0) {
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode' );
			return PclZip::errorCode ();
		}
		fseek ( $v_file_compressed, 10 );
		$v_size = $p_header ['compressed_size'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @fread ( $v_file_compressed, $v_read_size );
			@fwrite ( $this->zip_fd, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		@fclose ( $v_file_compressed );
		@unlink ( $v_gzip_temp_name );
		return $v_result;
	}
	function privCalculateStoredFilename(&$p_filedescr, &$p_options) {
		$v_result = 1;
		$p_filename = $p_filedescr ['filename'];
		if (isset ( $p_options [PCLZIP_OPT_ADD_PATH] )) {
			$p_add_dir = $p_options [PCLZIP_OPT_ADD_PATH];
		} else {
			$p_add_dir = '';
		}
		if (isset ( $p_options [PCLZIP_OPT_REMOVE_PATH] )) {
			$p_remove_dir = $p_options [PCLZIP_OPT_REMOVE_PATH];
		} else {
			$p_remove_dir = '';
		}
		if (isset ( $p_options [PCLZIP_OPT_REMOVE_ALL_PATH] )) {
			$p_remove_all_dir = $p_options [PCLZIP_OPT_REMOVE_ALL_PATH];
		} else {
			$p_remove_all_dir = 0;
		}
		if (isset ( $p_filedescr ['new_full_name'] )) {
			$v_stored_filename = PclZipUtilTranslateWinPath ( $p_filedescr ['new_full_name'] );
		} else {
			if (isset ( $p_filedescr ['new_short_name'] )) {
				$v_path_info = pathinfo ( $p_filename );
				$v_dir = '';
				if ($v_path_info ['dirname'] != '') {
					$v_dir = $v_path_info ['dirname'] . '/';
				}
				$v_stored_filename = $v_dir . $p_filedescr ['new_short_name'];
			} else {
				$v_stored_filename = $p_filename;
			}
			if ($p_remove_all_dir) {
				$v_stored_filename = basename ( $p_filename );
			} else if ($p_remove_dir != "") {
				if (substr ( $p_remove_dir, - 1 ) != '/')
					$p_remove_dir .= "/";
				if ((substr ( $p_filename, 0, 2 ) == "./") || (substr ( $p_remove_dir, 0, 2 ) == "./")) {
					if ((substr ( $p_filename, 0, 2 ) == "./") && (substr ( $p_remove_dir, 0, 2 ) != "./")) {
						$p_remove_dir = "./" . $p_remove_dir;
					}
					if ((substr ( $p_filename, 0, 2 ) != "./") && (substr ( $p_remove_dir, 0, 2 ) == "./")) {
						$p_remove_dir = substr ( $p_remove_dir, 2 );
					}
				}
				$v_compare = PclZipUtilPathInclusion ( $p_remove_dir, $v_stored_filename );
				if ($v_compare > 0) {
					if ($v_compare == 2) {
						$v_stored_filename = "";
					} else {
						$v_stored_filename = substr ( $v_stored_filename, strlen ( $p_remove_dir ) );
					}
				}
			}
			$v_stored_filename = PclZipUtilTranslateWinPath ( $v_stored_filename );
			if ($p_add_dir != "") {
				if (substr ( $p_add_dir, - 1 ) == "/")
					$v_stored_filename = $p_add_dir . $v_stored_filename;
				else
					$v_stored_filename = $p_add_dir . "/" . $v_stored_filename;
			}
		}
		$v_stored_filename = PclZipUtilPathReduction ( $v_stored_filename );
		$p_filedescr ['stored_filename'] = $v_stored_filename;
		return $v_result;
	}
	function privWriteFileHeader(&$p_header) {
		$v_result = 1;
		$p_header ['offset'] = ftell ( $this->zip_fd );
		$v_date = getdate ( $p_header ['mtime'] );
		$v_mtime = ($v_date ['hours'] << 11) + ($v_date ['minutes'] << 5) + $v_date ['seconds'] / 2;
		$v_mdate = (($v_date ['year'] - 1980) << 9) + ($v_date ['mon'] << 5) + $v_date ['mday'];
		$v_binary_data = pack ( "VvvvvvVVVvv", 0x04034b50, $p_header ['version_extracted'], $p_header ['flag'], $p_header ['compression'], $v_mtime, $v_mdate, $p_header ['crc'], $p_header ['compressed_size'], $p_header ['size'], strlen ( $p_header ['stored_filename'] ), $p_header ['extra_len'] );
		fputs ( $this->zip_fd, $v_binary_data, 30 );
		if (strlen ( $p_header ['stored_filename'] ) != 0) {
			fputs ( $this->zip_fd, $p_header ['stored_filename'], strlen ( $p_header ['stored_filename'] ) );
		}
		if ($p_header ['extra_len'] != 0) {
			fputs ( $this->zip_fd, $p_header ['extra'], $p_header ['extra_len'] );
		}
		return $v_result;
	}
	function privWriteCentralFileHeader(&$p_header) {
		$v_result = 1;
		$v_date = getdate ( $p_header ['mtime'] );
		$v_mtime = ($v_date ['hours'] << 11) + ($v_date ['minutes'] << 5) + $v_date ['seconds'] / 2;
		$v_mdate = (($v_date ['year'] - 1980) << 9) + ($v_date ['mon'] << 5) + $v_date ['mday'];
		$v_binary_data = pack ( "VvvvvvvVVVvvvvvVV", 0x02014b50, $p_header ['version'], $p_header ['version_extracted'], $p_header ['flag'], $p_header ['compression'], $v_mtime, $v_mdate, $p_header ['crc'], $p_header ['compressed_size'], $p_header ['size'], strlen ( $p_header ['stored_filename'] ), $p_header ['extra_len'], $p_header ['comment_len'], $p_header ['disk'], $p_header ['internal'], $p_header ['external'], $p_header ['offset'] );
		fputs ( $this->zip_fd, $v_binary_data, 46 );
		if (strlen ( $p_header ['stored_filename'] ) != 0) {
			fputs ( $this->zip_fd, $p_header ['stored_filename'], strlen ( $p_header ['stored_filename'] ) );
		}
		if ($p_header ['extra_len'] != 0) {
			fputs ( $this->zip_fd, $p_header ['extra'], $p_header ['extra_len'] );
		}
		if ($p_header ['comment_len'] != 0) {
			fputs ( $this->zip_fd, $p_header ['comment'], $p_header ['comment_len'] );
		}
		return $v_result;
	}
	function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) {
		$v_result = 1;
		$v_binary_data = pack ( "VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen ( $p_comment ) );
		fputs ( $this->zip_fd, $v_binary_data, 22 );
		if (strlen ( $p_comment ) != 0) {
			fputs ( $this->zip_fd, $p_comment, strlen ( $p_comment ) );
		}
		return $v_result;
	}
	function privList(&$p_list) {
		$v_result = 1;
		$this->privDisableMagicQuotes ();
		if (($this->zip_fd = @fopen ( $this->zipname, 'rb' )) == 0) {
			$this->privSwapBackMagicQuotes ();
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \'' . $this->zipname . '\' in binary read mode' );
			return PclZip::errorCode ();
		}
		$v_central_dir = array ();
		if (($v_result = $this->privReadEndCentralDir ( $v_central_dir )) != 1) {
			$this->privSwapBackMagicQuotes ();
			return $v_result;
		}
		@rewind ( $this->zip_fd );
		if (@fseek ( $this->zip_fd, $v_central_dir ['offset'] )) {
			$this->privSwapBackMagicQuotes ();
			PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size' );
			return PclZip::errorCode ();
		}
		for($i = 0; $i < $v_central_dir ['entries']; $i ++) {
			if (($v_result = $this->privReadCentralFileHeader ( $v_header )) != 1) {
				$this->privSwapBackMagicQuotes ();
				return $v_result;
			}
			$v_header ['index'] = $i;
			$this->privConvertHeader2FileInfo ( $v_header, $p_list [$i] );
			unset ( $v_header );
		}
		$this->privCloseFd ();
		$this->privSwapBackMagicQuotes ();
		return $v_result;
	}
	function privConvertHeader2FileInfo($p_header, &$p_info) {
		$v_result = 1;
		$v_temp_path = PclZipUtilPathReduction ( $p_header ['filename'] );
		$p_info ['filename'] = $v_temp_path;
		$v_temp_path = PclZipUtilPathReduction ( $p_header ['stored_filename'] );
		$p_info ['stored_filename'] = $v_temp_path;
		$p_info ['size'] = $p_header ['size'];
		$p_info ['compressed_size'] = $p_header ['compressed_size'];
		$p_info ['mtime'] = $p_header ['mtime'];
		$p_info ['comment'] = $p_header ['comment'];
		$p_info ['folder'] = (($p_header ['external'] & 0x00000010) == 0x00000010);
		$p_info ['index'] = $p_header ['index'];
		$p_info ['status'] = $p_header ['status'];
		$p_info ['crc'] = $p_header ['crc'];
		return $v_result;
	}
	function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) {
		$v_result = 1;
		$this->privDisableMagicQuotes ();
		if (($p_path == "") || ((substr ( $p_path, 0, 1 ) != "/") && (substr ( $p_path, 0, 3 ) != "../") && (substr ( $p_path, 1, 2 ) != ":/")))
			$p_path = "./" . $p_path;
		if (($p_path != "./") && ($p_path != "/")) {
			while ( substr ( $p_path, - 1 ) == "/" ) {
				$p_path = substr ( $p_path, 0, strlen ( $p_path ) - 1 );
			}
		}
		if (($p_remove_path != "") && (substr ( $p_remove_path, - 1 ) != '/')) {
			$p_remove_path .= '/';
		}
		$p_remove_path_size = strlen ( $p_remove_path );
		if (($v_result = $this->privOpenFd ( 'rb' )) != 1) {
			$this->privSwapBackMagicQuotes ();
			return $v_result;
		}
		$v_central_dir = array ();
		if (($v_result = $this->privReadEndCentralDir ( $v_central_dir )) != 1) {
			$this->privCloseFd ();
			$this->privSwapBackMagicQuotes ();
			return $v_result;
		}
		$v_pos_entry = $v_central_dir ['offset'];
		$j_start = 0;
		for($i = 0, $v_nb_extracted = 0; $i < $v_central_dir ['entries']; $i ++) {
			@rewind ( $this->zip_fd );
			if (@fseek ( $this->zip_fd, $v_pos_entry )) {
				$this->privCloseFd ();
				$this->privSwapBackMagicQuotes ();
				PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size' );
				return PclZip::errorCode ();
			}
			$v_header = array ();
			if (($v_result = $this->privReadCentralFileHeader ( $v_header )) != 1) {
				$this->privCloseFd ();
				$this->privSwapBackMagicQuotes ();
				return $v_result;
			}
			$v_header ['index'] = $i;
			$v_pos_entry = ftell ( $this->zip_fd );
			$v_extract = false;
			if ((isset ( $p_options [PCLZIP_OPT_BY_NAME] )) && ($p_options [PCLZIP_OPT_BY_NAME] != 0)) {
				for($j = 0; ($j < sizeof ( $p_options [PCLZIP_OPT_BY_NAME] )) && (! $v_extract); $j ++) {
					if (substr ( $p_options [PCLZIP_OPT_BY_NAME] [$j], - 1 ) == "/") {
						if ((strlen ( $v_header ['stored_filename'] ) > strlen ( $p_options [PCLZIP_OPT_BY_NAME] [$j] )) && (substr ( $v_header ['stored_filename'], 0, strlen ( $p_options [PCLZIP_OPT_BY_NAME] [$j] ) ) == $p_options [PCLZIP_OPT_BY_NAME] [$j])) {
							$v_extract = true;
						}
					} elseif ($v_header ['stored_filename'] == $p_options [PCLZIP_OPT_BY_NAME] [$j]) {
						$v_extract = true;
					}
				}
			} else if ((isset ( $p_options [PCLZIP_OPT_BY_PREG] )) && ($p_options [PCLZIP_OPT_BY_PREG] != "")) {
				if (preg_match ( $p_options [PCLZIP_OPT_BY_PREG], $v_header ['stored_filename'] )) {
					$v_extract = true;
				}
			} else if ((isset ( $p_options [PCLZIP_OPT_BY_INDEX] )) && ($p_options [PCLZIP_OPT_BY_INDEX] != 0)) {
				for($j = $j_start; ($j < sizeof ( $p_options [PCLZIP_OPT_BY_INDEX] )) && (! $v_extract); $j ++) {
					if (($i >= $p_options [PCLZIP_OPT_BY_INDEX] [$j] ['start']) && ($i <= $p_options [PCLZIP_OPT_BY_INDEX] [$j] ['end'])) {
						$v_extract = true;
					}
					if ($i >= $p_options [PCLZIP_OPT_BY_INDEX] [$j] ['end']) {
						$j_start = $j + 1;
					}
					if ($p_options [PCLZIP_OPT_BY_INDEX] [$j] ['start'] > $i) {
						break;
					}
				}
			} else {
				$v_extract = true;
			}
			if (($v_extract) && (($v_header ['compression'] != 8) && ($v_header ['compression'] != 0))) {
				$v_header ['status'] = 'unsupported_compression';
				if ((isset ( $p_options [PCLZIP_OPT_STOP_ON_ERROR] )) && ($p_options [PCLZIP_OPT_STOP_ON_ERROR] === true)) {
					$this->privSwapBackMagicQuotes ();
					PclZip::privErrorLog ( PCLZIP_ERR_UNSUPPORTED_COMPRESSION, "Filename '" . $v_header ['stored_filename'] . "' is " . "compressed by an unsupported compression " . "method (" . $v_header ['compression'] . ") " );
					return PclZip::errorCode ();
				}
			}
			if (($v_extract) && (($v_header ['flag'] & 1) == 1)) {
				$v_header ['status'] = 'unsupported_encryption';
				if ((isset ( $p_options [PCLZIP_OPT_STOP_ON_ERROR] )) && ($p_options [PCLZIP_OPT_STOP_ON_ERROR] === true)) {
					$this->privSwapBackMagicQuotes ();
					PclZip::privErrorLog ( PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, "Unsupported encryption for " . " filename '" . $v_header ['stored_filename'] . "'" );
					return PclZip::errorCode ();
				}
			}
			if (($v_extract) && ($v_header ['status'] != 'ok')) {
				$v_result = $this->privConvertHeader2FileInfo ( $v_header, $p_file_list [$v_nb_extracted ++] );
				if ($v_result != 1) {
					$this->privCloseFd ();
					$this->privSwapBackMagicQuotes ();
					return $v_result;
				}
				$v_extract = false;
			}
			if ($v_extract) {
				@rewind ( $this->zip_fd );
				if (@fseek ( $this->zip_fd, $v_header ['offset'] )) {
					$this->privCloseFd ();
					$this->privSwapBackMagicQuotes ();
					PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size' );
					return PclZip::errorCode ();
				}
				if ($p_options [PCLZIP_OPT_EXTRACT_AS_STRING]) {
					$v_string = '';
					$v_result1 = $this->privExtractFileAsString ( $v_header, $v_string, $p_options );
					if ($v_result1 < 1) {
						$this->privCloseFd ();
						$this->privSwapBackMagicQuotes ();
						return $v_result1;
					}
					if (($v_result = $this->privConvertHeader2FileInfo ( $v_header, $p_file_list [$v_nb_extracted] )) != 1) {
						$this->privCloseFd ();
						$this->privSwapBackMagicQuotes ();
						return $v_result;
					}
					$p_file_list [$v_nb_extracted] ['content'] = $v_string;
					$v_nb_extracted ++;
					if ($v_result1 == 2) {
						break;
					}
				} elseif ((isset ( $p_options [PCLZIP_OPT_EXTRACT_IN_OUTPUT] )) && ($p_options [PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
					$v_result1 = $this->privExtractFileInOutput ( $v_header, $p_options );
					if ($v_result1 < 1) {
						$this->privCloseFd ();
						$this->privSwapBackMagicQuotes ();
						return $v_result1;
					}
					if (($v_result = $this->privConvertHeader2FileInfo ( $v_header, $p_file_list [$v_nb_extracted ++] )) != 1) {
						$this->privCloseFd ();
						$this->privSwapBackMagicQuotes ();
						return $v_result;
					}
					if ($v_result1 == 2) {
						break;
					}
				} else {
					$v_result1 = $this->privExtractFile ( $v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options );
					if ($v_result1 < 1) {
						$this->privCloseFd ();
						$this->privSwapBackMagicQuotes ();
						return $v_result1;
					}
					if (($v_result = $this->privConvertHeader2FileInfo ( $v_header, $p_file_list [$v_nb_extracted ++] )) != 1) {
						$this->privCloseFd ();
						$this->privSwapBackMagicQuotes ();
						return $v_result;
					}
					if ($v_result1 == 2) {
						break;
					}
				}
			}
		}
		$this->privCloseFd ();
		$this->privSwapBackMagicQuotes ();
		return $v_result;
	}
	function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) {
		$v_result = 1;
		if (($v_result = $this->privReadFileHeader ( $v_header )) != 1) {
			return $v_result;
		}
		if ($this->privCheckFileHeaders ( $v_header, $p_entry ) != 1) {
		}
		if ($p_remove_all_path == true) {
			if (($p_entry ['external'] & 0x00000010) == 0x00000010) {
				$p_entry ['status'] = "filtered";
				return $v_result;
			}
			$p_entry ['filename'] = basename ( $p_entry ['filename'] );
		} else if ($p_remove_path != "") {
			if (PclZipUtilPathInclusion ( $p_remove_path, $p_entry ['filename'] ) == 2) {
				$p_entry ['status'] = "filtered";
				return $v_result;
			}
			$p_remove_path_size = strlen ( $p_remove_path );
			if (substr ( $p_entry ['filename'], 0, $p_remove_path_size ) == $p_remove_path) {
				$p_entry ['filename'] = substr ( $p_entry ['filename'], $p_remove_path_size );
			}
		}
		if ($p_path != '') {
			$p_entry ['filename'] = $p_path . "/" . $p_entry ['filename'];
		}
		if (isset ( $p_options [PCLZIP_OPT_EXTRACT_DIR_RESTRICTION] )) {
			$v_inclusion = PclZipUtilPathInclusion ( $p_options [PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], $p_entry ['filename'] );
			if ($v_inclusion == 0) {
				PclZip::privErrorLog ( PCLZIP_ERR_DIRECTORY_RESTRICTION, "Filename '" . $p_entry ['filename'] . "' is " . "outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION" );
				return PclZip::errorCode ();
			}
		}
		if (isset ( $p_options [PCLZIP_CB_PRE_EXTRACT] )) {
			$v_local_header = array ();
			$this->privConvertHeader2FileInfo ( $p_entry, $v_local_header );
			$v_result = $p_options [PCLZIP_CB_PRE_EXTRACT] ( PCLZIP_CB_PRE_EXTRACT, $v_local_header );
			if ($v_result == 0) {
				$p_entry ['status'] = "skipped";
				$v_result = 1;
			}
			if ($v_result == 2) {
				$p_entry ['status'] = "aborted";
				$v_result = PCLZIP_ERR_USER_ABORTED;
			}
			$p_entry ['filename'] = $v_local_header ['filename'];
		}
		if ($p_entry ['status'] == 'ok') {
			if (file_exists ( $p_entry ['filename'] )) {
				if (is_dir ( $p_entry ['filename'] )) {
					$p_entry ['status'] = "already_a_directory";
					if ((isset ( $p_options [PCLZIP_OPT_STOP_ON_ERROR] )) && ($p_options [PCLZIP_OPT_STOP_ON_ERROR] === true)) {
						PclZip::privErrorLog ( PCLZIP_ERR_ALREADY_A_DIRECTORY, "Filename '" . $p_entry ['filename'] . "' is " . "already used by an existing directory" );
						return PclZip::errorCode ();
					}
				} else if (! is_writeable ( $p_entry ['filename'] )) {
					$p_entry ['status'] = "write_protected";
					if ((isset ( $p_options [PCLZIP_OPT_STOP_ON_ERROR] )) && ($p_options [PCLZIP_OPT_STOP_ON_ERROR] === true)) {
						PclZip::privErrorLog ( PCLZIP_ERR_WRITE_OPEN_FAIL, "Filename '" . $p_entry ['filename'] . "' exists " . "and is write protected" );
						return PclZip::errorCode ();
					}
				} else if (filemtime ( $p_entry ['filename'] ) > $p_entry ['mtime']) {
					if ((isset ( $p_options [PCLZIP_OPT_REPLACE_NEWER] )) && ($p_options [PCLZIP_OPT_REPLACE_NEWER] === true)) {
					} else {
						$p_entry ['status'] = "newer_exist";
						if ((isset ( $p_options [PCLZIP_OPT_STOP_ON_ERROR] )) && ($p_options [PCLZIP_OPT_STOP_ON_ERROR] === true)) {
							PclZip::privErrorLog ( PCLZIP_ERR_WRITE_OPEN_FAIL, "Newer version of '" . $p_entry ['filename'] . "' exists " . "and option PCLZIP_OPT_REPLACE_NEWER is not selected" );
							return PclZip::errorCode ();
						}
					}
				} else {
				}
			} else {
				if ((($p_entry ['external'] & 0x00000010) == 0x00000010) || (substr ( $p_entry ['filename'], - 1 ) == '/'))
					$v_dir_to_check = $p_entry ['filename'];
				else if (! strstr ( $p_entry ['filename'], "/" ))
					$v_dir_to_check = "";
				else
					$v_dir_to_check = dirname ( $p_entry ['filename'] );
				if (($v_result = $this->privDirCheck ( $v_dir_to_check, (($p_entry ['external'] & 0x00000010) == 0x00000010) )) != 1) {
					$p_entry ['status'] = "path_creation_fail";
					$v_result = 1;
				}
			}
		}
		if ($p_entry ['status'] == 'ok') {
			if (! (($p_entry ['external'] & 0x00000010) == 0x00000010)) {
				if ($p_entry ['compression'] == 0) {
					if (($v_dest_file = @fopen ( $p_entry ['filename'], 'wb' )) == 0) {
						$p_entry ['status'] = "write_error";
						return $v_result;
					}
					$v_size = $p_entry ['compressed_size'];
					while ( $v_size != 0 ) {
						$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
						$v_buffer = @fread ( $this->zip_fd, $v_read_size );
						@fwrite ( $v_dest_file, $v_buffer, $v_read_size );
						$v_size -= $v_read_size;
					}
					fclose ( $v_dest_file );
					touch ( $p_entry ['filename'], $p_entry ['mtime'] );
				} else {
					if (($p_entry ['flag'] & 1) == 1) {
						PclZip::privErrorLog ( PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \'' . $p_entry ['filename'] . '\' is encrypted. Encrypted files are not supported.' );
						return PclZip::errorCode ();
					}
					if ((! isset ( $p_options [PCLZIP_OPT_TEMP_FILE_OFF] )) && (isset ( $p_options [PCLZIP_OPT_TEMP_FILE_ON] ) || (isset ( $p_options [PCLZIP_OPT_TEMP_FILE_THRESHOLD] ) && ($p_options [PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry ['size'])))) {
						$v_result = $this->privExtractFileUsingTempFile ( $p_entry, $p_options );
						if ($v_result < PCLZIP_ERR_NO_ERROR) {
							return $v_result;
						}
					} else {
						$v_buffer = @fread ( $this->zip_fd, $p_entry ['compressed_size'] );
						$v_file_content = @gzinflate ( $v_buffer );
						unset ( $v_buffer );
						if ($v_file_content === FALSE) {
							$p_entry ['status'] = "error";
							return $v_result;
						}
						if (($v_dest_file = @fopen ( $p_entry ['filename'], 'wb' )) == 0) {
							$p_entry ['status'] = "write_error";
							return $v_result;
						}
						@fwrite ( $v_dest_file, $v_file_content, $p_entry ['size'] );
						unset ( $v_file_content );
						@fclose ( $v_dest_file );
					}
					@touch ( $p_entry ['filename'], $p_entry ['mtime'] );
				}
				if (isset ( $p_options [PCLZIP_OPT_SET_CHMOD] )) {
					@chmod ( $p_entry ['filename'], $p_options [PCLZIP_OPT_SET_CHMOD] );
				}
			}
		}
		if ($p_entry ['status'] == "aborted") {
			$p_entry ['status'] = "skipped";
		} elseif (isset ( $p_options [PCLZIP_CB_POST_EXTRACT] )) {
			$v_local_header = array ();
			$this->privConvertHeader2FileInfo ( $p_entry, $v_local_header );
			$v_result = $p_options [PCLZIP_CB_POST_EXTRACT] ( PCLZIP_CB_POST_EXTRACT, $v_local_header );
			if ($v_result == 2) {
				$v_result = PCLZIP_ERR_USER_ABORTED;
			}
		}
		return $v_result;
	}
	function privExtractFileUsingTempFile(&$p_entry, &$p_options) {
		$v_result = 1;
		$v_gzip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid ( 'pclzip-' ) . '.gz';
		if (($v_dest_file = @fopen ( $v_gzip_temp_name, "wb" )) == 0) {
			fclose ( $v_file );
			PclZip::privErrorLog ( PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary write mode' );
			return PclZip::errorCode ();
		}
		$v_binary_data = pack ( 'va1a1Va1a1', 0x8b1f, Chr ( $p_entry ['compression'] ), Chr ( 0x00 ), time (), Chr ( 0x00 ), Chr ( 3 ) );
		@fwrite ( $v_dest_file, $v_binary_data, 10 );
		$v_size = $p_entry ['compressed_size'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @fread ( $this->zip_fd, $v_read_size );
			@fwrite ( $v_dest_file, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		$v_binary_data = pack ( 'VV', $p_entry ['crc'], $p_entry ['size'] );
		@fwrite ( $v_dest_file, $v_binary_data, 8 );
		@fclose ( $v_dest_file );
		if (($v_dest_file = @fopen ( $p_entry ['filename'], 'wb' )) == 0) {
			$p_entry ['status'] = "write_error";
			return $v_result;
		}
		if (($v_src_file = @gzopen ( $v_gzip_temp_name, 'rb' )) == 0) {
			@fclose ( $v_dest_file );
			$p_entry ['status'] = "read_error";
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode' );
			return PclZip::errorCode ();
		}
		$v_size = $p_entry ['size'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @gzread ( $v_src_file, $v_read_size );
			@fwrite ( $v_dest_file, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		@fclose ( $v_dest_file );
		@gzclose ( $v_src_file );
		@unlink ( $v_gzip_temp_name );
		return $v_result;
	}
	function privExtractFileInOutput(&$p_entry, &$p_options) {
		$v_result = 1;
		if (($v_result = $this->privReadFileHeader ( $v_header )) != 1) {
			return $v_result;
		}
		if ($this->privCheckFileHeaders ( $v_header, $p_entry ) != 1) {
		}
		if (isset ( $p_options [PCLZIP_CB_PRE_EXTRACT] )) {
			$v_local_header = array ();
			$this->privConvertHeader2FileInfo ( $p_entry, $v_local_header );
			$v_result = $p_options [PCLZIP_CB_PRE_EXTRACT] ( PCLZIP_CB_PRE_EXTRACT, $v_local_header );
			if ($v_result == 0) {
				$p_entry ['status'] = "skipped";
				$v_result = 1;
			}
			if ($v_result == 2) {
				$p_entry ['status'] = "aborted";
				$v_result = PCLZIP_ERR_USER_ABORTED;
			}
			$p_entry ['filename'] = $v_local_header ['filename'];
		}
		if ($p_entry ['status'] == 'ok') {
			if (! (($p_entry ['external'] & 0x00000010) == 0x00000010)) {
				if ($p_entry ['compressed_size'] == $p_entry ['size']) {
					$v_buffer = @fread ( $this->zip_fd, $p_entry ['compressed_size'] );
					echo $v_buffer;
					unset ( $v_buffer );
				} else {
					$v_buffer = @fread ( $this->zip_fd, $p_entry ['compressed_size'] );
					$v_file_content = gzinflate ( $v_buffer );
					unset ( $v_buffer );
					echo $v_file_content;
					unset ( $v_file_content );
				}
			}
		}
		if ($p_entry ['status'] == "aborted") {
			$p_entry ['status'] = "skipped";
		} elseif (isset ( $p_options [PCLZIP_CB_POST_EXTRACT] )) {
			$v_local_header = array ();
			$this->privConvertHeader2FileInfo ( $p_entry, $v_local_header );
			$v_result = $p_options [PCLZIP_CB_POST_EXTRACT] ( PCLZIP_CB_POST_EXTRACT, $v_local_header );
			if ($v_result == 2) {
				$v_result = PCLZIP_ERR_USER_ABORTED;
			}
		}
		return $v_result;
	}
	function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) {
		$v_result = 1;
		$v_header = array ();
		if (($v_result = $this->privReadFileHeader ( $v_header )) != 1) {
			return $v_result;
		}
		if ($this->privCheckFileHeaders ( $v_header, $p_entry ) != 1) {
		}
		if (isset ( $p_options [PCLZIP_CB_PRE_EXTRACT] )) {
			$v_local_header = array ();
			$this->privConvertHeader2FileInfo ( $p_entry, $v_local_header );
			$v_result = $p_options [PCLZIP_CB_PRE_EXTRACT] ( PCLZIP_CB_PRE_EXTRACT, $v_local_header );
			if ($v_result == 0) {
				$p_entry ['status'] = "skipped";
				$v_result = 1;
			}
			if ($v_result == 2) {
				$p_entry ['status'] = "aborted";
				$v_result = PCLZIP_ERR_USER_ABORTED;
			}
			$p_entry ['filename'] = $v_local_header ['filename'];
		}
		if ($p_entry ['status'] == 'ok') {
			if (! (($p_entry ['external'] & 0x00000010) == 0x00000010)) {
				if ($p_entry ['compression'] == 0) {
					$p_string = @fread ( $this->zip_fd, $p_entry ['compressed_size'] );
				} else {
					$v_data = @fread ( $this->zip_fd, $p_entry ['compressed_size'] );
					if (($p_string = @gzinflate ( $v_data )) === FALSE) {
					}
				}
			} else {
			}
		}
		if ($p_entry ['status'] == "aborted") {
			$p_entry ['status'] = "skipped";
		} elseif (isset ( $p_options [PCLZIP_CB_POST_EXTRACT] )) {
			$v_local_header = array ();
			$this->privConvertHeader2FileInfo ( $p_entry, $v_local_header );
			$v_local_header ['content'] = $p_string;
			$p_string = '';
			$v_result = $p_options [PCLZIP_CB_POST_EXTRACT] ( PCLZIP_CB_POST_EXTRACT, $v_local_header );
			$p_string = $v_local_header ['content'];
			unset ( $v_local_header ['content'] );
			if ($v_result == 2) {
				$v_result = PCLZIP_ERR_USER_ABORTED;
			}
		}
		return $v_result;
	}
	function privReadFileHeader(&$p_header) {
		$v_result = 1;
		$v_binary_data = @fread ( $this->zip_fd, 4 );
		$v_data = unpack ( 'Vid', $v_binary_data );
		if ($v_data ['id'] != 0x04034b50) {
			PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure' );
			return PclZip::errorCode ();
		}
		$v_binary_data = fread ( $this->zip_fd, 26 );
		if (strlen ( $v_binary_data ) != 26) {
			$p_header ['filename'] = "";
			$p_header ['status'] = "invalid_header";
			PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, "Invalid block size : " . strlen ( $v_binary_data ) );
			return PclZip::errorCode ();
		}
		$v_data = unpack ( 'vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data );
		$p_header ['filename'] = fread ( $this->zip_fd, $v_data ['filename_len'] );
		if ($v_data ['extra_len'] != 0) {
			$p_header ['extra'] = fread ( $this->zip_fd, $v_data ['extra_len'] );
		} else {
			$p_header ['extra'] = '';
		}
		$p_header ['version_extracted'] = $v_data ['version'];
		$p_header ['compression'] = $v_data ['compression'];
		$p_header ['size'] = $v_data ['size'];
		$p_header ['compressed_size'] = $v_data ['compressed_size'];
		$p_header ['crc'] = $v_data ['crc'];
		$p_header ['flag'] = $v_data ['flag'];
		$p_header ['filename_len'] = $v_data ['filename_len'];
		$p_header ['mdate'] = $v_data ['mdate'];
		$p_header ['mtime'] = $v_data ['mtime'];
		if ($p_header ['mdate'] && $p_header ['mtime']) {
			$v_hour = ($p_header ['mtime'] & 0xF800) >> 11;
			$v_minute = ($p_header ['mtime'] & 0x07E0) >> 5;
			$v_seconde = ($p_header ['mtime'] & 0x001F) * 2;
			$v_year = (($p_header ['mdate'] & 0xFE00) >> 9) + 1980;
			$v_month = ($p_header ['mdate'] & 0x01E0) >> 5;
			$v_day = $p_header ['mdate'] & 0x001F;
			$p_header ['mtime'] = @mktime ( $v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year );
		} else {
			$p_header ['mtime'] = time ();
		}
		$p_header ['stored_filename'] = $p_header ['filename'];
		$p_header ['status'] = "ok";
		return $v_result;
	}
	function privReadCentralFileHeader(&$p_header) {
		$v_result = 1;
		$v_binary_data = @fread ( $this->zip_fd, 4 );
		$v_data = unpack ( 'Vid', $v_binary_data );
		if ($v_data ['id'] != 0x02014b50) {
			PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure' );
			return PclZip::errorCode ();
		}
		$v_binary_data = fread ( $this->zip_fd, 42 );
		if (strlen ( $v_binary_data ) != 42) {
			$p_header ['filename'] = "";
			$p_header ['status'] = "invalid_header";
			PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, "Invalid block size : " . strlen ( $v_binary_data ) );
			return PclZip::errorCode ();
		}
		$p_header = unpack ( 'vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data );
		if ($p_header ['filename_len'] != 0)
			$p_header ['filename'] = fread ( $this->zip_fd, $p_header ['filename_len'] );
		else
			$p_header ['filename'] = '';
		if ($p_header ['extra_len'] != 0)
			$p_header ['extra'] = fread ( $this->zip_fd, $p_header ['extra_len'] );
		else
			$p_header ['extra'] = '';
		if ($p_header ['comment_len'] != 0)
			$p_header ['comment'] = fread ( $this->zip_fd, $p_header ['comment_len'] );
		else
			$p_header ['comment'] = '';
		if (1) {
			$v_hour = ($p_header ['mtime'] & 0xF800) >> 11;
			$v_minute = ($p_header ['mtime'] & 0x07E0) >> 5;
			$v_seconde = ($p_header ['mtime'] & 0x001F) * 2;
			$v_year = (($p_header ['mdate'] & 0xFE00) >> 9) + 1980;
			$v_month = ($p_header ['mdate'] & 0x01E0) >> 5;
			$v_day = $p_header ['mdate'] & 0x001F;
			$p_header ['mtime'] = @mktime ( $v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year );
		} else {
			$p_header ['mtime'] = time ();
		}
		$p_header ['stored_filename'] = $p_header ['filename'];
		$p_header ['status'] = 'ok';
		if (substr ( $p_header ['filename'], - 1 ) == '/') {
			$p_header ['external'] = 0x00000010;
		}
		return $v_result;
	}
	function privCheckFileHeaders(&$p_local_header, &$p_central_header) {
		$v_result = 1;
		if ($p_local_header ['filename'] != $p_central_header ['filename']) {
		}
		if ($p_local_header ['version_extracted'] != $p_central_header ['version_extracted']) {
		}
		if ($p_local_header ['flag'] != $p_central_header ['flag']) {
		}
		if ($p_local_header ['compression'] != $p_central_header ['compression']) {
		}
		if ($p_local_header ['mtime'] != $p_central_header ['mtime']) {
		}
		if ($p_local_header ['filename_len'] != $p_central_header ['filename_len']) {
		}
		if (($p_local_header ['flag'] & 8) == 8) {
			$p_local_header ['size'] = $p_central_header ['size'];
			$p_local_header ['compressed_size'] = $p_central_header ['compressed_size'];
			$p_local_header ['crc'] = $p_central_header ['crc'];
		}
		return $v_result;
	}
	function privReadEndCentralDir(&$p_central_dir) {
		$v_result = 1;
		$v_size = filesize ( $this->zipname );
		@fseek ( $this->zip_fd, $v_size );
		if (@ftell ( $this->zip_fd ) != $v_size) {
			PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \'' . $this->zipname . '\'' );
			return PclZip::errorCode ();
		}
		$v_found = 0;
		if ($v_size > 26) {
			@fseek ( $this->zip_fd, $v_size - 22 );
			if (($v_pos = @ftell ( $this->zip_fd )) != ($v_size - 22)) {
				PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \'' . $this->zipname . '\'' );
				return PclZip::errorCode ();
			}
			$v_binary_data = @fread ( $this->zip_fd, 4 );
			$v_data = @unpack ( 'Vid', $v_binary_data );
			if ($v_data ['id'] == 0x06054b50) {
				$v_found = 1;
			}
			$v_pos = ftell ( $this->zip_fd );
		}
		if (! $v_found) {
			$v_maximum_size = 65557;
			if ($v_maximum_size > $v_size)
				$v_maximum_size = $v_size;
			@fseek ( $this->zip_fd, $v_size - $v_maximum_size );
			if (@ftell ( $this->zip_fd ) != ($v_size - $v_maximum_size)) {
				PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \'' . $this->zipname . '\'' );
				return PclZip::errorCode ();
			}
			$v_pos = ftell ( $this->zip_fd );
			$v_bytes = 0x00000000;
			while ( $v_pos < $v_size ) {
				$v_byte = @fread ( $this->zip_fd, 1 );
				$v_bytes = (($v_bytes & 0xFFFFFF) << 8) | Ord ( $v_byte );
				if ($v_bytes == 0x504b0506) {
					$v_pos ++;
					break;
				}
				$v_pos ++;
			}
			if ($v_pos == $v_size) {
				PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature" );
				return PclZip::errorCode ();
			}
		}
		$v_binary_data = fread ( $this->zip_fd, 18 );
		if (strlen ( $v_binary_data ) != 18) {
			PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : " . strlen ( $v_binary_data ) );
			return PclZip::errorCode ();
		}
		$v_data = unpack ( 'vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data );
		if (($v_pos + $v_data ['comment_size'] + 18) != $v_size) {
			if (0) {
				PclZip::privErrorLog ( PCLZIP_ERR_BAD_FORMAT, 'The central dir is not at the end of the archive.' . ' Some trailing bytes exists after the archive.' );
				return PclZip::errorCode ();
			}
		}
		if ($v_data ['comment_size'] != 0) {
			$p_central_dir ['comment'] = fread ( $this->zip_fd, $v_data ['comment_size'] );
		} else
			$p_central_dir ['comment'] = '';
		$p_central_dir ['entries'] = $v_data ['entries'];
		$p_central_dir ['disk_entries'] = $v_data ['disk_entries'];
		$p_central_dir ['offset'] = $v_data ['offset'];
		$p_central_dir ['size'] = $v_data ['size'];
		$p_central_dir ['disk'] = $v_data ['disk'];
		$p_central_dir ['disk_start'] = $v_data ['disk_start'];
		return $v_result;
	}
	function privDeleteByRule(&$p_result_list, &$p_options) {
		$v_result = 1;
		$v_list_detail = array ();
		if (($v_result = $this->privOpenFd ( 'rb' )) != 1) {
			return $v_result;
		}
		$v_central_dir = array ();
		if (($v_result = $this->privReadEndCentralDir ( $v_central_dir )) != 1) {
			$this->privCloseFd ();
			return $v_result;
		}
		@rewind ( $this->zip_fd );
		$v_pos_entry = $v_central_dir ['offset'];
		@rewind ( $this->zip_fd );
		if (@fseek ( $this->zip_fd, $v_pos_entry )) {
			$this->privCloseFd ();
			PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size' );
			return PclZip::errorCode ();
		}
		$v_header_list = array ();
		$j_start = 0;
		for($i = 0, $v_nb_extracted = 0; $i < $v_central_dir ['entries']; $i ++) {
			$v_header_list [$v_nb_extracted] = array ();
			if (($v_result = $this->privReadCentralFileHeader ( $v_header_list [$v_nb_extracted] )) != 1) {
				$this->privCloseFd ();
				return $v_result;
			}
			$v_header_list [$v_nb_extracted] ['index'] = $i;
			$v_found = false;
			if ((isset ( $p_options [PCLZIP_OPT_BY_NAME] )) && ($p_options [PCLZIP_OPT_BY_NAME] != 0)) {
				for($j = 0; ($j < sizeof ( $p_options [PCLZIP_OPT_BY_NAME] )) && (! $v_found); $j ++) {
					if (substr ( $p_options [PCLZIP_OPT_BY_NAME] [$j], - 1 ) == "/") {
						if ((strlen ( $v_header_list [$v_nb_extracted] ['stored_filename'] ) > strlen ( $p_options [PCLZIP_OPT_BY_NAME] [$j] )) && (substr ( $v_header_list [$v_nb_extracted] ['stored_filename'], 0, strlen ( $p_options [PCLZIP_OPT_BY_NAME] [$j] ) ) == $p_options [PCLZIP_OPT_BY_NAME] [$j])) {
							$v_found = true;
						} elseif ((($v_header_list [$v_nb_extracted] ['external'] & 0x00000010) == 0x00000010) && ($v_header_list [$v_nb_extracted] ['stored_filename'] . '/' == $p_options [PCLZIP_OPT_BY_NAME] [$j])) {
							$v_found = true;
						}
					} elseif ($v_header_list [$v_nb_extracted] ['stored_filename'] == $p_options [PCLZIP_OPT_BY_NAME] [$j]) {
						$v_found = true;
					}
				}
			} else if ((isset ( $p_options [PCLZIP_OPT_BY_PREG] )) && ($p_options [PCLZIP_OPT_BY_PREG] != "")) {
				if (preg_match ( $p_options [PCLZIP_OPT_BY_PREG], $v_header_list [$v_nb_extracted] ['stored_filename'] )) {
					$v_found = true;
				}
			} else if ((isset ( $p_options [PCLZIP_OPT_BY_INDEX] )) && ($p_options [PCLZIP_OPT_BY_INDEX] != 0)) {
				for($j = $j_start; ($j < sizeof ( $p_options [PCLZIP_OPT_BY_INDEX] )) && (! $v_found); $j ++) {
					if (($i >= $p_options [PCLZIP_OPT_BY_INDEX] [$j] ['start']) && ($i <= $p_options [PCLZIP_OPT_BY_INDEX] [$j] ['end'])) {
						$v_found = true;
					}
					if ($i >= $p_options [PCLZIP_OPT_BY_INDEX] [$j] ['end']) {
						$j_start = $j + 1;
					}
					if ($p_options [PCLZIP_OPT_BY_INDEX] [$j] ['start'] > $i) {
						break;
					}
				}
			} else {
				$v_found = true;
			}
			if ($v_found) {
				unset ( $v_header_list [$v_nb_extracted] );
			} else {
				$v_nb_extracted ++;
			}
		}
		if ($v_nb_extracted > 0) {
			$v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid ( 'pclzip-' ) . '.tmp';
			$v_temp_zip = new PclZip ( $v_zip_temp_name );
			if (($v_result = $v_temp_zip->privOpenFd ( 'wb' )) != 1) {
				$this->privCloseFd ();
				return $v_result;
			}
			for($i = 0; $i < sizeof ( $v_header_list ); $i ++) {
				@rewind ( $this->zip_fd );
				if (@fseek ( $this->zip_fd, $v_header_list [$i] ['offset'] )) {
					$this->privCloseFd ();
					$v_temp_zip->privCloseFd ();
					@unlink ( $v_zip_temp_name );
					PclZip::privErrorLog ( PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size' );
					return PclZip::errorCode ();
				}
				$v_local_header = array ();
				if (($v_result = $this->privReadFileHeader ( $v_local_header )) != 1) {
					$this->privCloseFd ();
					$v_temp_zip->privCloseFd ();
					@unlink ( $v_zip_temp_name );
					return $v_result;
				}
				if ($this->privCheckFileHeaders ( $v_local_header, $v_header_list [$i] ) != 1) {
				}
				unset ( $v_local_header );
				if (($v_result = $v_temp_zip->privWriteFileHeader ( $v_header_list [$i] )) != 1) {
					$this->privCloseFd ();
					$v_temp_zip->privCloseFd ();
					@unlink ( $v_zip_temp_name );
					return $v_result;
				}
				if (($v_result = PclZipUtilCopyBlock ( $this->zip_fd, $v_temp_zip->zip_fd, $v_header_list [$i] ['compressed_size'] )) != 1) {
					$this->privCloseFd ();
					$v_temp_zip->privCloseFd ();
					@unlink ( $v_zip_temp_name );
					return $v_result;
				}
			}
			$v_offset = @ftell ( $v_temp_zip->zip_fd );
			for($i = 0; $i < sizeof ( $v_header_list ); $i ++) {
				if (($v_result = $v_temp_zip->privWriteCentralFileHeader ( $v_header_list [$i] )) != 1) {
					$v_temp_zip->privCloseFd ();
					$this->privCloseFd ();
					@unlink ( $v_zip_temp_name );
					return $v_result;
				}
				$v_temp_zip->privConvertHeader2FileInfo ( $v_header_list [$i], $p_result_list [$i] );
			}
			$v_comment = '';
			if (isset ( $p_options [PCLZIP_OPT_COMMENT] )) {
				$v_comment = $p_options [PCLZIP_OPT_COMMENT];
			}
			$v_size = @ftell ( $v_temp_zip->zip_fd ) - $v_offset;
			if (($v_result = $v_temp_zip->privWriteCentralHeader ( sizeof ( $v_header_list ), $v_size, $v_offset, $v_comment )) != 1) {
				unset ( $v_header_list );
				$v_temp_zip->privCloseFd ();
				$this->privCloseFd ();
				@unlink ( $v_zip_temp_name );
				return $v_result;
			}
			$v_temp_zip->privCloseFd ();
			$this->privCloseFd ();
			@unlink ( $this->zipname );
			PclZipUtilRename ( $v_zip_temp_name, $this->zipname );
			unset ( $v_temp_zip );
		} else if ($v_central_dir ['entries'] != 0) {
			$this->privCloseFd ();
			if (($v_result = $this->privOpenFd ( 'wb' )) != 1) {
				return $v_result;
			}
			if (($v_result = $this->privWriteCentralHeader ( 0, 0, 0, '' )) != 1) {
				return $v_result;
			}
			$this->privCloseFd ();
		}
		return $v_result;
	}
	function privDirCheck($p_dir, $p_is_dir = false) {
		$v_result = 1;
		if (($p_is_dir) && (substr ( $p_dir, - 1 ) == '/')) {
			$p_dir = substr ( $p_dir, 0, strlen ( $p_dir ) - 1 );
		}
		if ((is_dir ( $p_dir )) || ($p_dir == "")) {
			return 1;
		}
		$p_parent_dir = dirname ( $p_dir );
		if ($p_parent_dir != $p_dir) {
			if ($p_parent_dir != "") {
				if (($v_result = $this->privDirCheck ( $p_parent_dir )) != 1) {
					return $v_result;
				}
			}
		}
		if (! @mkdir ( $p_dir, 0777 )) {
			PclZip::privErrorLog ( PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'" );
			return PclZip::errorCode ();
		}
		return $v_result;
	}
	function privMerge(&$p_archive_to_add) {
		$v_result = 1;
		if (! is_file ( $p_archive_to_add->zipname )) {
			$v_result = 1;
			return $v_result;
		}
		if (! is_file ( $this->zipname )) {
			$v_result = $this->privDuplicate ( $p_archive_to_add->zipname );
			return $v_result;
		}
		if (($v_result = $this->privOpenFd ( 'rb' )) != 1) {
			return $v_result;
		}
		$v_central_dir = array ();
		if (($v_result = $this->privReadEndCentralDir ( $v_central_dir )) != 1) {
			$this->privCloseFd ();
			return $v_result;
		}
		@rewind ( $this->zip_fd );
		if (($v_result = $p_archive_to_add->privOpenFd ( 'rb' )) != 1) {
			$this->privCloseFd ();
			return $v_result;
		}
		$v_central_dir_to_add = array ();
		if (($v_result = $p_archive_to_add->privReadEndCentralDir ( $v_central_dir_to_add )) != 1) {
			$this->privCloseFd ();
			$p_archive_to_add->privCloseFd ();
			return $v_result;
		}
		@rewind ( $p_archive_to_add->zip_fd );
		$v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid ( 'pclzip-' ) . '.tmp';
		if (($v_zip_temp_fd = @fopen ( $v_zip_temp_name, 'wb' )) == 0) {
			$this->privCloseFd ();
			$p_archive_to_add->privCloseFd ();
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_zip_temp_name . '\' in binary write mode' );
			return PclZip::errorCode ();
		}
		$v_size = $v_central_dir ['offset'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = fread ( $this->zip_fd, $v_read_size );
			@fwrite ( $v_zip_temp_fd, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		$v_size = $v_central_dir_to_add ['offset'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = fread ( $p_archive_to_add->zip_fd, $v_read_size );
			@fwrite ( $v_zip_temp_fd, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		$v_offset = @ftell ( $v_zip_temp_fd );
		$v_size = $v_central_dir ['size'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @fread ( $this->zip_fd, $v_read_size );
			@fwrite ( $v_zip_temp_fd, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		$v_size = $v_central_dir_to_add ['size'];
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @fread ( $p_archive_to_add->zip_fd, $v_read_size );
			@fwrite ( $v_zip_temp_fd, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		$v_comment = $v_central_dir ['comment'] . ' ' . $v_central_dir_to_add ['comment'];
		$v_size = @ftell ( $v_zip_temp_fd ) - $v_offset;
		$v_swap = $this->zip_fd;
		$this->zip_fd = $v_zip_temp_fd;
		$v_zip_temp_fd = $v_swap;
		if (($v_result = $this->privWriteCentralHeader ( $v_central_dir ['entries'] + $v_central_dir_to_add ['entries'], $v_size, $v_offset, $v_comment )) != 1) {
			$this->privCloseFd ();
			$p_archive_to_add->privCloseFd ();
			@fclose ( $v_zip_temp_fd );
			$this->zip_fd = null;
			unset ( $v_header_list );
			return $v_result;
		}
		$v_swap = $this->zip_fd;
		$this->zip_fd = $v_zip_temp_fd;
		$v_zip_temp_fd = $v_swap;
		$this->privCloseFd ();
		$p_archive_to_add->privCloseFd ();
		@fclose ( $v_zip_temp_fd );
		@unlink ( $this->zipname );
		PclZipUtilRename ( $v_zip_temp_name, $this->zipname );
		return $v_result;
	}
	function privDuplicate($p_archive_filename) {
		$v_result = 1;
		if (! is_file ( $p_archive_filename )) {
			$v_result = 1;
			return $v_result;
		}
		if (($v_result = $this->privOpenFd ( 'wb' )) != 1) {
			return $v_result;
		}
		if (($v_zip_temp_fd = @fopen ( $p_archive_filename, 'rb' )) == 0) {
			$this->privCloseFd ();
			PclZip::privErrorLog ( PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \'' . $p_archive_filename . '\' in binary write mode' );
			return PclZip::errorCode ();
		}
		$v_size = filesize ( $p_archive_filename );
		while ( $v_size != 0 ) {
			$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = fread ( $v_zip_temp_fd, $v_read_size );
			@fwrite ( $this->zip_fd, $v_buffer, $v_read_size );
			$v_size -= $v_read_size;
		}
		$this->privCloseFd ();
		@fclose ( $v_zip_temp_fd );
		return $v_result;
	}
	function privErrorLog($p_error_code = 0, $p_error_string = '') {
		if (PCLZIP_ERROR_EXTERNAL == 1) {
			PclError ( $p_error_code, $p_error_string );
		} else {
			$this->error_code = $p_error_code;
			$this->error_string = $p_error_string;
		}
	}
	function privErrorReset() {
		if (PCLZIP_ERROR_EXTERNAL == 1) {
			PclErrorReset ();
		} else {
			$this->error_code = 0;
			$this->error_string = '';
		}
	}
	function privDisableMagicQuotes() {
		$v_result = 1;
		if ((! function_exists ( "get_magic_quotes_runtime" )) || (! function_exists ( "set_magic_quotes_runtime" ))) {
			return $v_result;
		}
		if ($this->magic_quotes_status != - 1) {
			return $v_result;
		}
		$this->magic_quotes_status = @get_magic_quotes_runtime ();
		if ($this->magic_quotes_status == 1) {
			@set_magic_quotes_runtime ( 0 );
		}
		return $v_result;
	}
	function privSwapBackMagicQuotes() {
		$v_result = 1;
		if ((! function_exists ( "get_magic_quotes_runtime" )) || (! function_exists ( "set_magic_quotes_runtime" ))) {
			return $v_result;
		}
		if ($this->magic_quotes_status != - 1) {
			return $v_result;
		}
		if ($this->magic_quotes_status == 1) {
			@set_magic_quotes_runtime ( $this->magic_quotes_status );
		}
		return $v_result;
	}
}
function PclZipUtilPathReduction($p_dir) {
	$v_result = "";
	if ($p_dir != "") {
		$v_list = explode ( "/", $p_dir );
		$v_skip = 0;
		for($i = sizeof ( $v_list ) - 1; $i >= 0; $i --) {
			if ($v_list [$i] == ".") {
			} else if ($v_list [$i] == "..") {
				$v_skip ++;
			} else if ($v_list [$i] == "") {
				if ($i == 0) {
					$v_result = "/" . $v_result;
					if ($v_skip > 0) {
						$v_result = $p_dir;
						$v_skip = 0;
					}
				} else if ($i == (sizeof ( $v_list ) - 1)) {
					$v_result = $v_list [$i];
				} else {
				}
			} else {
				if ($v_skip > 0) {
					$v_skip --;
				} else {
					$v_result = $v_list [$i] . ($i != (sizeof ( $v_list ) - 1) ? "/" . $v_result : "");
				}
			}
		}
		if ($v_skip > 0) {
			while ( $v_skip > 0 ) {
				$v_result = '../' . $v_result;
				$v_skip --;
			}
		}
	}
	return $v_result;
}
function PclZipUtilPathInclusion($p_dir, $p_path) {
	$v_result = 1;
	if (($p_dir == '.') || ((strlen ( $p_dir ) >= 2) && (substr ( $p_dir, 0, 2 ) == './'))) {
		$p_dir = PclZipUtilTranslateWinPath ( getcwd (), FALSE ) . '/' . substr ( $p_dir, 1 );
	}
	if (($p_path == '.') || ((strlen ( $p_path ) >= 2) && (substr ( $p_path, 0, 2 ) == './'))) {
		$p_path = PclZipUtilTranslateWinPath ( getcwd (), FALSE ) . '/' . substr ( $p_path, 1 );
	}
	$v_list_dir = explode ( "/", $p_dir );
	$v_list_dir_size = sizeof ( $v_list_dir );
	$v_list_path = explode ( "/", $p_path );
	$v_list_path_size = sizeof ( $v_list_path );
	$i = 0;
	$j = 0;
	while ( ($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result) ) {
		if ($v_list_dir [$i] == '') {
			$i ++;
			continue;
		}
		if ($v_list_path [$j] == '') {
			$j ++;
			continue;
		}
		if (($v_list_dir [$i] != $v_list_path [$j]) && ($v_list_dir [$i] != '') && ($v_list_path [$j] != '')) {
			$v_result = 0;
		}
		$i ++;
		$j ++;
	}
	if ($v_result) {
		while ( ($j < $v_list_path_size) && ($v_list_path [$j] == '') )
			$j ++;
		while ( ($i < $v_list_dir_size) && ($v_list_dir [$i] == '') )
			$i ++;
		if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
			$v_result = 2;
		} else if ($i < $v_list_dir_size) {
			$v_result = 0;
		}
	}
	return $v_result;
}
function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode = 0) {
	$v_result = 1;
	if ($p_mode == 0) {
		while ( $p_size != 0 ) {
			$v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @fread ( $p_src, $v_read_size );
			@fwrite ( $p_dest, $v_buffer, $v_read_size );
			$p_size -= $v_read_size;
		}
	} else if ($p_mode == 1) {
		while ( $p_size != 0 ) {
			$v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @gzread ( $p_src, $v_read_size );
			@fwrite ( $p_dest, $v_buffer, $v_read_size );
			$p_size -= $v_read_size;
		}
	} else if ($p_mode == 2) {
		while ( $p_size != 0 ) {
			$v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @fread ( $p_src, $v_read_size );
			@gzwrite ( $p_dest, $v_buffer, $v_read_size );
			$p_size -= $v_read_size;
		}
	} else if ($p_mode == 3) {
		while ( $p_size != 0 ) {
			$v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
			$v_buffer = @gzread ( $p_src, $v_read_size );
			@gzwrite ( $p_dest, $v_buffer, $v_read_size );
			$p_size -= $v_read_size;
		}
	}
	return $v_result;
}
function PclZipUtilRename($p_src, $p_dest) {
	$v_result = 1;
	if (! @rename ( $p_src, $p_dest )) {
		if (! @copy ( $p_src, $p_dest )) {
			$v_result = 0;
		} else if (! @unlink ( $p_src )) {
			$v_result = 0;
		}
	}
	return $v_result;
}
function PclZipUtilOptionText($p_option) {
	$v_list = get_defined_constants ();
	for(reset ( $v_list ); $v_key = key ( $v_list ); next ( $v_list )) {
		$v_prefix = substr ( $v_key, 0, 10 );
		if ((($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT')) && ($v_list [$v_key] == $p_option)) {
			return $v_key;
		}
	}
	$v_result = 'Unknown';
	return $v_result;
}
function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter = true) {
	if (stristr ( php_uname (), 'windows' )) {
		if (($p_remove_disk_letter) && (($v_position = strpos ( $p_path, ':' )) != false)) {
			$p_path = substr ( $p_path, $v_position + 1 );
		}
		if ((strpos ( $p_path, '\\' ) > 0) || (substr ( $p_path, 0, 1 ) == '\\')) {
			$p_path = strtr ( $p_path, '\\', '/' );
		}
	}
	return $p_path;
}
?>
